是否有更好的方法将itemidlist转换为路径字符串而不是SHGetPathFromIDList()?

时间:2013-03-15 14:29:51

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

Microsoft提供了一个类CMFCShellTreeCtrl来浏览shell命名空间层次结构(基本上与浏览器窗口的左侧相同)。

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

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

但是,当您尝试从控件获取此类路径时,接口会响应一个空字符串,因为它依赖于SHGetPathFromIDList(),它不会解析不在文件系统上的shell项。< / p>

有没有人知道一个更好的ImprovedSHGetPathFromIDList()的实现,它适用于文件系统上没有的ITEMIDLIST(例如\ WOLF)?


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

然而,这可以在其他地方使用,作为路径名和ITEMIDLIST之间的通用改进往返(毕竟,UNC名称是表达fielsystem路径的一种相当常见的方式!)

1 个答案:

答案 0 :(得分:2)

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