【问题标题】:Is there a better way to convert an itemidlist into a path-string than SHGetPathFromIDList()?有没有比 SHGetPathFromIDList() 更好的方法将 itemidlist 转换为路径字符串?
【发布时间】:2013-03-04 07:38:39
【问题描述】:

Microsoft 提供了一个类 CMFCShellTreeCtrl 用于浏览 shell 命名空间层次结构(本质上与资源管理器窗口的左侧相同)。

此控件使用SHGetPathFromIDList() 以便从项 ID 列表转到当前路径(选定项)的字符串表示形式。

可以使用任何最终匹配其内部外壳层次结构的字符串设置其当前项目,即使所涉及的对象不在“文件系统上” - 例如。 \\WOLF 将选择 Networking 节点下的机器 WOLF(假设您的 LAN 上有一台名为 WOLF 的机器)。

但是,当您尝试从控件获取这样的路径时,接口会以空白字符串响应,因为它依赖于 SHGetPathFromIDList(),它不会解析不在文件系统上的 shell 项。

有谁知道更好的ImprovedSHGetPathFromIDList() 的实现,它可以与文件系统上不存在的 ITEMIDLIST(例如 \WOLF)一起使用?


我可以为 shell 树控件本身提供我自己版本的 SelectPath()GetItemPath(),实现我自己版本的 ITEMIDLIST 字符串逻辑,以便两者完全对称(即我想要 GetItemPath( ) 以返回先前用于成功 SelectPath() 的相同路径 - 或用于树视图中的任何节点)。

但是,这可以在其他地方使用,作为路径名和 ITEMIDLIST 之间的一般改进的往返(毕竟,UNC 名称是表示字段系统路径的一种相当常见的方式!)

【问题讨论】:

    标签: c++ winapi mfc visual-studio-2012 windows-shell


    【解决方案1】:

    AFAIK,非文件系统项目没有预制功能。您必须在每个项目上使用IShellFolder::GetDisplayNameOf() 遍历ITEMIDLIST,指定SIGDN_PARENTRELATIVEPARSINGSIGDN_DESKTOPABSOLUTEPARSING 标志,以手动构建路径字符串。

    【讨论】:

    • 你能提供一个简短的例子吗?
    • @Victor 我现在不在电脑前。但简而言之,您将不得不在ITEMIDLIST 中走动这些项目。从ITEMIDLIST 相对于IShellFolder 开始(SHGetDesktopFolder() 是绝对ITEMIDLIST)。对于列表中的第一项,使用IShellFolder::GetDisplayNameOf() 获取其字符串,使用IShellFolder::BindToObject() 获取其IShellFolder 接口。然后对列表中的每个后续项目重复,将字符串连接在一起,直到列表用完。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2011-06-28
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多