技术开发 频道

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


【IT168 技术文档】

    让我们详细解释一下 Shell 编程中最基本的一些函数、结构体和枚举。

    SHGetDesktopFolder

    获取桌面的 IShellFolder 接口
[DllImport("shell32.dll")] public static extern Int32 SHGetDesktopFolder(out IntPtr ppshf);
    要使用这个函数,必须先定义一个 IntPtr 指针。然后通过指针,使用 GetObjectForIUnknown 返回通过指向 COM 对象的 IShellFolder 接口的指针实例。于是需要编写以下函数:
public static IShellFolder GetDesktopFolder(out IntPtr ppshf) { SHGetDesktopFolder(out ppshf); Object obj = Marshal.GetObjectForIUnknown(ppshf); return (IShellFolder)obj; }
ParseDisplayName

    获得对象的PIDL,即便对象在目录树中处于当前目录下一层或更多层。例如,对于文件对象来说,它的解析名就是它的路径,我们用文件系统对象的完全路径名来调用桌面的IshellFolder接口的 ParseDisplayName 方法,它会返回这个对象的完全PIDL。定义:
void ParseDisplayName( IntPtr hwnd, IntPtr pbc, [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName, out uint pchEaten, out IntPtr ppidl, ref uint pdwAttributes);
里面最重要的参数就是 out IntPtr ppidl 了,它返回 pszDisplayName 指定路径对应的 PIDL。然而仅仅是 PIDL 并不能让你做更多的事情。这时候还需要调用 BindToObject 来返回 IShellFolder 接口。

BindToObject

    根据 PIDL 创建和初始化 IShellFolder 对象。定义:
void BindToObject( IntPtr pidl, IntPtr pbc, [In()] ref Guid riid, out IShellFolder ppv);
    里面有一个 [In()] ref Guid riid 参数,表示接口的接口标识符 (IID)。GUID其实就是一个唯一的标识符。世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。我们这里使用 IID_IShellFolder 表示它获取的是一个 IShellFolder 接口。

public static Guid IID_IShellFolder = new Guid("{000214E6-0000-0000-C000-000000000046}");




0
相关文章