c++ - 有没有比 SHGetPathFromIDList() 更好的方法将 itemidlist 转换为路径字符串?

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

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

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

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

但是,当您尝试从控件返回这样的路径时,由于它依赖于 SHGetPathFromIDList() 不会解析非在文件系统上。

有谁知道更好的 ImprovedSHGetPathFromIDList() 的实现,它适用于不在文件系统(例如\WOLF)上的 ITEMIDLIST?


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

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

最佳答案

据我所知,没有针对非文件系统项目的预制函数。您必须在每个项目上使用 IShellFolder::GetDisplayNameOf() 遍历 ITEMIDLIST,指定 SIGDN_PARENTRELATIVEPARSINGSIGDN_DESKTOABSOLUTEPARSING 标志,手动构建路径字符串。

关于c++ - 有没有比 SHGetPathFromIDList() 更好的方法将 itemidlist 转换为路径字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434963/

相关文章:

c++ - 音频流 C++ 服务器/客户端

c++ - 跳出 try block 是否合法?

通过管道重定向时捕获 SetConsoleTextAttribute 的效果?

c - 如何在 Windows 中退出阻塞的 recv()?

c++ - 在 MFC 上单击按钮时显示文本

c++ - С++ Microsoft MFC TreeView 图标

c++ - 在 OpenCV C++ 中为 OCR 规范化车牌

c++ - 第一次部署 Qt 应用程序,动态链接?

c++ - 是否有 C++11 或 Win32 方法来可靠地生成和保存跟踪信息?

c++ - 维护最近的文件列表