有比SHGetPathFromIDList()更好的将itemidlist转换为路径字符串的方法吗?(涉及IT技术)

4

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

该控件使用SHGetPathFromIDList()从项目ID列表转换为当前路径的字符串表示形式(所选项目)。

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

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

是否有人知道更好的ImprovedSHGetPathFromIDList()实现,可以处理不在文件系统上的ITEMIDLIST(例如\WOLF)?


我可以为shell树控件提供自己版本的SelectPath()GetItemPath(),实现自己版本的ITEMIDLIST<->字符串逻辑,以使两者完全对称(即,我希望GetItemPath()返回之前成功选择的路径 - 或树视图中的任何节点)。

但是,这在其他地方可能也有用,作为路径名和ITEMIDLIST之间通用改进的往返(毕竟,UNC名称是一种表达文件系统路径的相当常见的方式!)

1个回答

2
据我所知,没有针对非文件系统项目的预制函数。您需要使用 IShellFolder::GetDisplayNameOf() 遍历每个 ITEMIDLIST,并指定 SIGDN_PARENTRELATIVEPARSINGSIGDN_DESKTOPABSOLUTEPARSING 标志来手动构建路径字符串。保留 HTML 标记。

请问您能提供一个简短的例子吗? - Victor
@Victor,我现在不在电脑旁边。但简单来说,您需要遍历ITEMIDLIST中的项目。从相对于ITEMIDLISTIShellFolder开始(对于绝对ITEMIDLIST使用SHGetDesktopFolder())。对于列表中的第一个项目,使用IShellFolder::GetDisplayNameOf()获取其字符串,并使用IShellFolder::BindToObject()获取其IShellFolder接口。然后重复每个后续项目,将字符串连接在一起,直到列表用尽。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接