技术开发 频道

(C#)Windows Shell 外壳编程系列3


【IT168 技术文档】
这里解释上一节中获取名称的方法。

GetDisplayNameOf 定义:
void GetDisplayNameOf( IntPtr pidl, SHGNO uFlags, IntPtr lpName);
    该方法是用来转换PIDL成为可显示的名称字符串。PIDL必须是相对于对象的父目录的。换句话说,它必须包含一个非空的SHITEMID 结构。因为有多种命名对象的方式,资源管理器通过在uFlags参数中定义SHGNO标识的组合来表示名称类型。SHGDN_NORMAL或SHGDN_INFOLDER将被用来指定名称是相对于文件夹的还是相对于桌面的。其他三个值SHGDN_FOREDITING、SHGDN_FORADDRESSBAR和SHGDN_FORPARSING可以用来指定名称的用途。 名称必须按STRRET的结构形式返回,如果SHGDN_FOREDITING、SHGDN_FORADDRESSBAR和 SHGDN_FORPARSING没有设定,就返回外壳对象的显示名称。

    具体实现方法:
/**//// <summary> /// 获取显示名称 /// </summary> public static string GetNameByIShell(IShellFolder Root, IntPtr pidlSub) { IntPtr strr = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4); Marshal.WriteInt32(strr, 0, 0); StringBuilder buf = new StringBuilder(MAX_PATH); Root.GetDisplayNameOf(pidlSub, SHGNO.INFOLDER, strr); API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH); Marshal.FreeCoTaskMem(strr); return buf.ToString(); }
SHGNO
    事实上,只要修改 SHGNO ,就可以获取其绝对路径:
/**//// <summary> /// 根据路径获取 IShellFolder 和 PIDL /// </summary> public static IShellFolder GetShellFolder(IShellFolder desktop, string path, out IntPtr Pidl) { IShellFolder IFolder; uint i, j = 0; desktop.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, path, out i, out Pidl, ref j); desktop.BindToObject(Pidl, IntPtr.Zero, ref Guids.IID_IShellFolder, out IFolder); return IFolder; }
    但我们还关心类似“桌面”、“我的文档”这种既是普通文件夹又是特殊对象的绝对路径如何获得,这里就要用到 SHGetSpecialFolderPath API 了。
[DllImport("Shell32.Dll")] private static extern bool SHGetSpecialFolderPath( IntPtr hwndOwner, StringBuilder lpszPath, ShellSpecialFolders nFolder, bool fCreate);
ShellSpecialFolders
/**//// <summary> /// 获取特殊文件夹的路径 /// </summary> public static string GetSpecialFolderPath(IntPtr hwnd, ShellSpecialFolders nFolder) { StringBuilder sb = new StringBuilder(MAX_PATH); SHGetSpecialFolderPath(hwnd, sb, nFolder, false); return sb.ToString(); }


0
相关文章