2

我想获取指定文件夹的系统图标,但检索图标的唯一方法可能是使用 SHGetFileInfo() 方法。SHGetFileInfo()方法的第一个参数是一个LPITEMIDLIST的指针。

如果我只有文件夹的绝对路径,如何根据路径获取指针?

4

1 回答 1

6

SHParseDisplayName()

欢迎来到 PIDL 的美妙世界。

您可以在Introduction to the Shell Namespace阅读更多内容,但基本上 PIDL 是指向项目 ID 列表的指针。您可以将其视为连续内存中的链表,但不是每个节点都有指向下一个节点的指针,而是拥有 cb 成员,它是包含该项目的字节数,因此您可以将其添加到获取下一项的基地址。IDList 以 { cb = 0, abID = NULL } 的项目终止。

那么,这些神奇的灯光里有什么?基本上你不在乎,也不知道。任何 IShellFolder 实现都可以创建一种新的 ID 类型来表示其在 shell 命名空间中的项类型。Shell 实现的基本文件系统视图仅将路径的部分存储在这些列表中,因此您在第一个列表中有“c:\”之类的内容,在下一个列表中有“Users\”等。实际上它们是序列化的可能包含更多数据的结构(或类)。但它们也可以代表打印机、网络共享、数据库搜索(用于搜索文件夹、堆栈等)。

您真正需要知道的是,您可以要求 IShellFolders 给您一个 PIDL 来表示它们包含的项目,然后您可以将该 PIDL 还给他们,以及其他各种 Shell 函数和接口,他们知道如何处理他们。SHParseDisplayName() 基本上所做的(我认为)是通过注册表查找所有已注册的 IShellFolder 实现,并询问他们是否知道如何处理您传入的字符串,第一个处理它的人会生成 PIDL 并给出它背部。

于 2009-07-07T04:34:55.760 回答