Microsoft提供了一个类CMFCShellTreeCtrl
,用于浏览shell命名空间层次结构(基本上就是资源管理器窗口的左侧)。
该控件使用SHGetPathFromIDList()
从项目ID列表转换为当前路径的字符串表示形式(所选项目)。
可以使用任何能匹配其内部shell层次结构的字符串来设置其当前项目,即使涉及的对象不在“文件系统”上也可以 - 例如,\\WOLF
将选择网络节点下的机器WOLF(假设您的局域网中有一台名为WOLF的机器)。
但是,由于它依赖于SHGetPathFromIDList()
,因此当您尝试从控件获取这样的路径时,接口会响应空字符串,该函数无法解析不在文件系统上的shell项。
是否有人知道更好的ImprovedSHGetPathFromIDList()
实现,可以处理不在文件系统上的ITEMIDLIST(例如\WOLF)?
我可以为shell树控件提供自己版本的SelectPath()
和GetItemPath()
,实现自己版本的ITEMIDLIST<->字符串逻辑,以使两者完全对称(即,我希望GetItemPath()返回之前成功选择的路径 - 或树视图中的任何节点)。
但是,这在其他地方可能也有用,作为路径名和ITEMIDLIST之间通用改进的往返(毕竟,UNC名称是一种表达文件系统路径的相当常见的方式!)
ITEMIDLIST
中的项目。从相对于ITEMIDLIST
的IShellFolder
开始(对于绝对ITEMIDLIST
使用SHGetDesktopFolder()
)。对于列表中的第一个项目,使用IShellFolder::GetDisplayNameOf()
获取其字符串,并使用IShellFolder::BindToObject()
获取其IShellFolder
接口。然后重复每个后续项目,将字符串连接在一起,直到列表用尽。 - Remy Lebeau