public static HRESULT SHResolveFolderPathInLibrary(IShellLibrary *plib, [NativeTypeName("PCWSTR")] ushort *pszFolderPath, [NativeTypeName("DWORD")] uint dwTimeout, [NativeTypeName("PWSTR *")] ushort **ppszResolvedPath)
    {
        *           ppszResolvedPath = null;
        ITEMIDLIST *pidlFolder       = SHSimpleIDListFromPath(pszFolderPath);
        HRESULT     hr = unchecked ((pidlFolder) != null ? ((int)(0)) : ((int)(0x80070057)));

        if (((unchecked ((int)(hr))) >= 0))
        {
            IShellItem *psiFolder;

            hr = SHCreateItemFromIDList(pidlFolder, __uuidof <IShellItem>(), (void **)(&psiFolder));
            if (((unchecked ((int)(hr))) >= 0))
            {
                IShellItem *psiResolved;

                hr = plib->ResolveFolder(psiFolder, dwTimeout, __uuidof <IShellItem>(), (void **)(&psiResolved));
                if (((unchecked ((int)(hr))) >= 0))
                {
                    unchecked (hr) = psiResolved->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, ppszResolvedPath);
                    _ = psiResolved->Release();
                }

                _ = psiFolder->Release();
            }

            CoTaskMemFree(pidlFolder);
        }

        return(hr);
    }
Ejemplo n.º 2
0
        public static unsafe string SHGetPathFromIDList(ITEMIDLIST *pidl)
        {
            char *pszPath = stackalloc char[Kernel32.MAX_PATH + 1];

            if (!SHGetPathFromIDList(pidl, pszPath))
            {
                throw new ArgumentException();
            }

            return(new string(pszPath));
        }
    public static HRESULT SHRemoveFolderPathFromLibrary(IShellLibrary *plib, [NativeTypeName("PCWSTR")] ushort *pszFolderPath)
    {
        ITEMIDLIST *pidlFolder = SHSimpleIDListFromPath(pszFolderPath);
        HRESULT     hr         = unchecked ((pidlFolder) != null ? ((int)(0)) : ((int)(0x80070057)));

        if (((unchecked ((int)(hr))) >= 0))
        {
            IShellItem *psiFolder;

            unchecked (hr) = SHCreateItemFromIDList(pidlFolder, __uuidof <IShellItem>(), (void **)(&psiFolder));
            if (((unchecked ((int)(hr))) >= 0))
            {
                unchecked (hr) = plib->RemoveFolder(psiFolder);
                _ = psiFolder->Release();
            }

            CoTaskMemFree(pidlFolder);
        }

        return(hr);
    }
 public HRESULT Initialize([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlTarget, uint uDisplayType, [NativeTypeName("LPCWSTR")] ushort *pszResName, [NativeTypeName("LPCWSTR")] ushort *pszProvider)
 {
     return(((delegate * unmanaged <IInitializeNetworkFolder *, ITEMIDLIST *, ITEMIDLIST *, uint, ushort *, ushort *, int>)(lpVtbl[3]))((IInitializeNetworkFolder *)Unsafe.AsPointer(ref this), pidl, pidlTarget, uDisplayType, pszResName, pszProvider));
 }
Ejemplo n.º 5
0
 public HRESULT SetShellFolder(IShellFolder *psf, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlFolder, HKEY hKey, [NativeTypeName("DWORD")] uint dwFlags)
 {
     return(((delegate * unmanaged <IShellMenu *, IShellFolder *, ITEMIDLIST *, HKEY, uint, int>)(lpVtbl[5]))((IShellMenu *)Unsafe.AsPointer(ref this), psf, pidlFolder, hKey, dwFlags));
 }
 public HRESULT GetEnumFlags(IShellFolder *psf, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlFolder, HWND *phwnd, [NativeTypeName("DWORD *")] uint *pgrfFlags)
 {
     return(((delegate * unmanaged <IFolderFilter *, IShellFolder *, ITEMIDLIST *, HWND *, uint *, int>)(lpVtbl[4]))((IFolderFilter *)Unsafe.AsPointer(ref this), psf, pidlFolder, phwnd, pgrfFlags));
 }
Ejemplo n.º 7
0
 public static extern unsafe bool SHGetPathFromIDList(
     ITEMIDLIST *pidl,
     [Friendly(FriendlyFlags.Array)] char *pszPath);
Ejemplo n.º 8
0
 public static extern unsafe HResult SHGetFolderLocation(
     IntPtr hwndOwner,
     CSIDL nFolder,
     IntPtr hToken,
     int dwReserved,
     out ITEMIDLIST *pidl);
 public HRESULT BindToStorage([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, IBindCtx *pbc, [NativeTypeName("const IID &")] Guid *riid, void **ppv)
 {
     return(((delegate * unmanaged <IShellFolder2 *, ITEMIDLIST *, IBindCtx *, Guid *, void **, int>)(lpVtbl[6]))((IShellFolder2 *)Unsafe.AsPointer(ref this), pidl, pbc, riid, ppv));
 }
 public HRESULT GetDetailsEx([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, [NativeTypeName("const SHCOLUMNID *")] PROPERTYKEY *pscid, VARIANT *pv)
 {
     return(((delegate * unmanaged <IShellFolder2 *, ITEMIDLIST *, PROPERTYKEY *, VARIANT *, int>)(lpVtbl[17]))((IShellFolder2 *)Unsafe.AsPointer(ref this), pidl, pscid, pv));
 }
 public HRESULT InitializeSFB(IShellFolder *psf, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl)
 {
     return(((delegate * unmanaged <IShellFolderBand *, IShellFolder *, ITEMIDLIST *, int>)(lpVtbl[3]))((IShellFolderBand *)Unsafe.AsPointer(ref this), psf, pidl));
 }
Ejemplo n.º 12
0
 public HRESULT GetIconOf([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, uint flags, int *pIconIndex)
 {
     return(((delegate * unmanaged <IShellIcon *, ITEMIDLIST *, uint, int *, int>)(lpVtbl[3]))((IShellIcon *)Unsafe.AsPointer(ref this), pidl, flags, pIconIndex));
 }
 public HRESULT LeaveFolder(IShellFolder *psf, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl)
 {
     return(((delegate * unmanaged <INamespaceWalkCB2 *, IShellFolder *, ITEMIDLIST *, int>)(lpVtbl[5]))((INamespaceWalkCB2 *)Unsafe.AsPointer(ref this), psf, pidl));
 }
Ejemplo n.º 14
0
 public HRESULT RemoveIDList([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl)
 {
     return(((delegate * unmanaged <IResultsFolder *, ITEMIDLIST *, int>)(lpVtbl[6]))((IResultsFolder *)Unsafe.AsPointer(ref this), pidl));
 }
Ejemplo n.º 15
0
 public HRESULT AddIDList([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, [NativeTypeName("LPITEMIDLIST *")] ITEMIDLIST **ppidlAdded)
 {
     return(((delegate * unmanaged <IResultsFolder *, ITEMIDLIST *, ITEMIDLIST **, int>)(lpVtbl[4]))((IResultsFolder *)Unsafe.AsPointer(ref this), pidl, ppidlAdded));
 }
Ejemplo n.º 16
0
 public HRESULT IncludeObject(IShellView *ppshv, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl)
 {
     return(((delegate * unmanaged <ICommDlgBrowser *, IShellView *, ITEMIDLIST *, int>)(lpVtbl[5]))((ICommDlgBrowser *)Unsafe.AsPointer(ref this), ppshv, pidl));
 }
Ejemplo n.º 17
0
 public HRESULT SetParentAndItem([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlParent, IShellFolder *psf, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlChild)
 {
     return(((delegate * unmanaged <IParentAndItem *, ITEMIDLIST *, IShellFolder *, ITEMIDLIST *, int>)(lpVtbl[3]))((IParentAndItem *)Unsafe.AsPointer(ref this), pidlParent, psf, pidlChild));
 }
 public HRESULT GetDisplayNameOf([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, [NativeTypeName("SHGDNF")] uint uFlags, STRRET *pName)
 {
     return(((delegate * unmanaged <IShellFolder2 *, ITEMIDLIST *, uint, STRRET *, int>)(lpVtbl[11]))((IShellFolder2 *)Unsafe.AsPointer(ref this), pidl, uFlags, pName));
 }
 public HRESULT SetNameOf(HWND hwnd, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, [NativeTypeName("LPCWSTR")] ushort *pszName, [NativeTypeName("SHGDNF")] uint uFlags, [NativeTypeName("LPITEMIDLIST *")] ITEMIDLIST **ppidlOut)
 {
     return(((delegate * unmanaged <IShellFolder2 *, HWND, ITEMIDLIST *, ushort *, uint, ITEMIDLIST **, int>)(lpVtbl[12]))((IShellFolder2 *)Unsafe.AsPointer(ref this), hwnd, pidl, pszName, uFlags, ppidlOut));
 }
        private unsafe Result ShowDialog(HWND owner)
        {
            SelectedPath = "";
            if (new FileOpenDialogInternal() is not IFileOpenDialog dialog)
            {
                throw new NullReferenceException(nameof(dialog));
            }

            try
            {
                dialog.SetOptions((uint)(_FILEOPENDIALOGOPTIONS.FOS_PICKFOLDERS | _FILEOPENDIALOGOPTIONS.FOS_FORCEFILESYSTEM));
                dialog.SetTitle(Title);

                if (Directory.Exists(InitializedPath))
                {
                    uint        attributes = 0;
                    ITEMIDLIST  itemIdList;
                    ITEMIDLIST *pItemIdList = &itemIdList;

                    if (PInvoke.SHILCreateFromPath(InitializedPath, out pItemIdList, &attributes).Succeeded)
                    {
                        if (PInvoke.SHCreateShellItem(default(ITEMIDLIST), default, *pItemIdList, out IShellItem item0).Succeeded)
                        {
                            dialog.SetFolder(item0);
                        }

                        // ◆以下の必要性を確認する → 必要なさそう。ITEMIDLIST (struct) の唯一のメンバの SHITEMID も struct (on stack) なので解放いらんはず。
                        //if (itemIdList != IntPtr.Zero) Marshal.FreeCoTaskMem(idl);
                    }
                }

#if false
                // ◆本来はこちらの実装が正しいと思うけど、CsWin32 の IFileOpenDialog.Show が
                //   HRESULT を返さないので(void戻り値なので)、しゃーなしで else側 の実装にした。
                var hr = dialog.Show(owner);
                if (hr == Constants.ERROR_CANCELLED)
                {
                    return(Result.Cancel);
                }
                if (hr != new HRESULT(0))
                {
                    return(Result.Abort);
                }
#else
                try
                {
                    // フォルダ選択ダイアログでキャンセルボタンを押すと COMException が発生する
                    dialog.Show(owner);
                }
                catch (COMException) { return(Result.Cancel); }
#endif

                dialog.GetResult(out IShellItem item);
                if (item is null)
                {
                    return(Result.Abort);
                }

                item.GetDisplayName(SIGDN.SIGDN_FILESYSPATH, out PWSTR selectedPath);
                SelectedPath = selectedPath.ToString();
                return(Result.OK);
            }
            finally
            {
                // ◆以下の必要性を確認する → これはCsWin32 と関係なく必要。
                Marshal.FinalReleaseComObject(dialog);
            }
        }
 public HRESULT GetDetailsOf([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, uint iColumn, SHELLDETAILS *psd)
 {
     return(((delegate * unmanaged <IShellFolder2 *, ITEMIDLIST *, uint, SHELLDETAILS *, int>)(lpVtbl[18]))((IShellFolder2 *)Unsafe.AsPointer(ref this), pidl, iColumn, psd));
 }
 public HRESULT SelectAndEditItem([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlItem, [NativeTypeName("NMCSAEI_FLAGS")] int flags)
 {
     return(((delegate * unmanaged <INewMenuClient *, ITEMIDLIST *, int, int>)(lpVtbl[4]))((INewMenuClient *)Unsafe.AsPointer(ref this), pidlItem, flags));
 }
 public HRESULT CompareIDs(LPARAM lParam, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl1, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl2)
 {
     return(((delegate * unmanaged <IShellFolder2 *, LPARAM, ITEMIDLIST *, ITEMIDLIST *, int>)(lpVtbl[7]))((IShellFolder2 *)Unsafe.AsPointer(ref this), lParam, pidl1, pidl2));
 }
Ejemplo n.º 24
0
 public HRESULT SetIDList([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl)
 {
     return(((delegate * unmanaged <IShellLinkA *, ITEMIDLIST *, int>)(lpVtbl[5]))((IShellLinkA *)Unsafe.AsPointer(ref this), pidl));
 }
Ejemplo n.º 25
0
 public static extern unsafe HResult SHGetKnownFolderIDList(
     [MarshalAs(UnmanagedType.LPStruct)] Guid rfid,
     KNOWN_FOLDER_FLAG dwFlags,
     IntPtr hToken,
     out ITEMIDLIST *pidl);
Ejemplo n.º 26
0
 public HRESULT SetItemPos([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl, POINT *ppt)
 {
     return(((delegate * unmanaged <IShellFolderView *, ITEMIDLIST *, POINT *, int>)(lpVtbl[22]))((IShellFolderView *)Unsafe.AsPointer(ref this), pidl, ppt));
 }
Ejemplo n.º 27
0
 public HRESULT Initialize([NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidl)
 {
     return(((delegate * unmanaged <IPersistFolder3 *, ITEMIDLIST *, int>)(lpVtbl[4]))((IPersistFolder3 *)Unsafe.AsPointer(ref this), pidl));
 }
 public HRESULT ShouldShow(IShellFolder *psf, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlFolder, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlItem)
 {
     return(((delegate * unmanaged <IFolderFilter *, IShellFolder *, ITEMIDLIST *, ITEMIDLIST *, int>)(lpVtbl[3]))((IFolderFilter *)Unsafe.AsPointer(ref this), psf, pidlFolder, pidlItem));
 }
Ejemplo n.º 29
0
 public HRESULT AddObject([NativeTypeName("LPITEMIDLIST")] ITEMIDLIST *pidl, uint *puItem)
 {
     return(((delegate * unmanaged <IShellFolderView *, ITEMIDLIST *, uint *, int>)(lpVtbl[8]))((IShellFolderView *)Unsafe.AsPointer(ref this), pidl, puItem));
 }
Ejemplo n.º 30
0
 public HRESULT InitializeEx(IBindCtx *pbc, [NativeTypeName("LPCITEMIDLIST")] ITEMIDLIST *pidlRoot, [NativeTypeName("const PERSIST_FOLDER_TARGET_INFO *")] PERSIST_FOLDER_TARGET_INFO *ppfti)
 {
     return(((delegate * unmanaged <IPersistFolder3 *, IBindCtx *, ITEMIDLIST *, PERSIST_FOLDER_TARGET_INFO *, int>)(lpVtbl[6]))((IPersistFolder3 *)Unsafe.AsPointer(ref this), pbc, pidlRoot, ppfti));
 }