【问题标题】:How to get a LPITEMIDLIST pointer according to the path of a folder?如何根据文件夹路径获取LPITEMIDLIST指针?
【发布时间】:2009-07-07 04:08:14
【问题描述】:

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

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

【问题讨论】:

    标签: icons explorer windows-shell


    【解决方案1】:

    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 并给出它背部。

    【讨论】:

    • 谢谢!我最近经常遇到 PIDL 的概念。你能推荐一些向我解释的文章吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2010-10-14
    相关资源
    最近更新 更多