65.9K
CodeProject 正在变化。 阅读更多。
Home

命名空间扩展:IDelegateFolder 谜团

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (4投票s)

2002 年 2 月 16 日

2分钟阅读

viewsIcon

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 接口。这个 IMallocAlloc 函数将分配一个 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 时,你必须遵循以下步骤

  • 调用这个 IMallocAlloc 函数
  • 在返回的缓冲区偏移量 4 处插入你自己的完整 pidl(包括大小)
  • 将此缓冲区作为你自己的 pidl 返回

返回的缓冲区已经是一个 pidl,从大小(2 字节)开始,然后是 2 字节的签名(0x61 0x03)。

所有传递给你的命名空间扩展的 pidl 也将具有这种格式。这意味着你会在偏移量 4 处找到你自己的 pidl。

pidl 仍然以正常方式释放,使用 shell 分配器。

如果你的命名空间扩展有子文件夹,那么这些子文件夹遵循正常的系统。列表中的第一个 id 将是特殊的 Internet Explorer pidl,所有其他 pidl 都是你自己的正常 pidl。

这不是微软选择的一个干净的解决方案。如果 Internet Explorer 根节点执行嵌入和提取的 pidl,那么将更容易,从而无需此接口。

© . All rights reserved.