命名空间扩展:IDelegateFolder 谜团






4.86/5 (4投票s)
2002 年 2 月 16 日
2分钟阅读

99111
未文档化的接口 IDelegateFolder 的文档
自从 Internet Explorer 4 以来,shell 命名空间就包含一个“Internet Explorer”项目。
这个 Internet Explorer 形成了一个特殊的连接点,你可以在其中包含你自己的命名空间扩展。
微软使用它来实现他们的 FTP 文件夹。你可以通过在注册表中注册一个 URL 前缀来添加你自己的。复制注册表中 HKEY_CLASSES_ROOT\ftp
中使用的条目。
然而,有些事情很奇怪。你没有看到这个命名空间扩展的根项目在资源管理器中显示。没有名为“ftp 文件夹”的项目作为所有 ftp 文件夹的根。相反,“Internet Explorer”项目充当根。
这有一个非常奇怪的含义:Internet Explorer 根项目必须理解所有底层命名空间的 pidl。
解决方案:Internet Explorer 会将其自己的 pidl 中嵌入所有命名空间扩展的 pidl。用于实现此机制的是 IDelegateFolder
。
使用 IDelegateFolder
,你的命名空间扩展将接收一个 IMalloc
接口。这个 IMalloc
的 Alloc
函数将分配一个 Internet Explorer pidl,该 pidl 指向你的命名空间扩展,并留有空余空间以放置你自己的 pidl。
这是 IDelegateFolder
的 IID
// {ADD8BA80-002B-11D0-8F0F-00C04FD7D062} DEFINE_GUID(IID_IDelegateFolder, 0xADD8BA80L, 0x002B, 0x11D0, 0x8F, 0x0F, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62);
这是接口定义
DECLARE_INTERFACE_(IDelegateFolder, IUnknown) { // IUnknown methods STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef)(THIS) PURE; STDMETHOD_(ULONG,Release)(THIS) PURE; // IDelegateFolder methods STDMETHOD(SetItemAlloc)(THIS_ IMalloc *pMalloc) PURE; };
实例化你的命名空间扩展后,Internet Explorer 将查询 IDelegateFolder
接口并调用 SetItemAlloc
,传递一个 IMalloc
接口。你必须存储这个接口。
从那一刻起,每当你需要创建一个 pidl 时,你必须遵循以下步骤
- 调用这个
IMalloc
的Alloc
函数 - 在返回的缓冲区偏移量 4 处插入你自己的完整 pidl(包括大小)
- 将此缓冲区作为你自己的 pidl 返回
返回的缓冲区已经是一个 pidl,从大小(2 字节)开始,然后是 2 字节的签名(0x61 0x03
)。
所有传递给你的命名空间扩展的 pidl 也将具有这种格式。这意味着你会在偏移量 4 处找到你自己的 pidl。
pidl 仍然以正常方式释放,使用 shell 分配器。
如果你的命名空间扩展有子文件夹,那么这些子文件夹遵循正常的系统。列表中的第一个 id 将是特殊的 Internet Explorer pidl,所有其他 pidl 都是你自己的正常 pidl。
这不是微软选择的一个干净的解决方案。如果 Internet Explorer 根节点执行嵌入和提取的 pidl,那么将更容易,从而无需此接口。