我想获取指定文件夹的系统图标,但是检索图标的唯一方法是使用SHGetFileInfo()方法。 SHGetFileInfo()方法的第一个参数是LPITEMIDLIST的指针。
如果我只有文件夹的绝对路径,如何根据路径获取指针?
答案 0 :(得分:5)
欢迎来到精彩的PIDL世界。
您可以在Introduction to the Shell Namespace阅读更多内容,但基本上PIDL是指向商品ID列表的指针。您可以将其视为连续内存中的链接列表,但不是每个节点都有指向下一个节点的指针,而是使用cb成员,该成员是包含该项的字节数,因此您可以将其添加到获取下一个项目的基地址。 IDLists以{cb = 0,abID = NULL}的项终止。
那么,这些神奇的东西是什么?基本上你不在乎也无法知道。任何IShellFolder实现都可以创建一种新类型的ID来表示shell命名空间中的项类型。 Shell实现的基本文件系统视图只是将路径的各个部分存储在这些列表中,所以你在下一个中的第一个“Users \”中有类似“c:\”的东西,等等。实际上它们是序列化的可能包含更多数据的结构(或类)。但它们也可以代表打印机,网络共享,数据库搜索(搜索文件夹,堆栈等)。
您真正需要知道的是,您可以要求IShellFolders为您提供一个表示其中包含的项目的PIDL,稍后您可以将PIDL返回给它们,以及其他各种Shell函数和接口,并且他们知道如何处理他们。什么SHParseDisplayName()基本上(我认为)是通过注册表查找所有已注册的IShellFolder实现,并询问他们是否知道如何处理您传入的字符串,并且第一个处理它的人生成PIDL并给它背部。