当用户在Windows资源管理器中导航到例如他的Android手机的SD卡上的文件夹时,资源管理器会显示一种痕迹路径,就像"This PC\Galaxy Tab A\Card\Folder1"在地址栏中单击一样.
在地址栏中输入或复制它们并按回车键时,Windows资源管理器也接受这些路径.
我想知道是否有办法使用Shell API解析这些面包屑路径并获得PItemIDList或IShellItem作为回报.到目前为止,我没有成功使用eg SHParseDisplayName().这段代码
LPITEMIDLIST itemidlist;
HRESULT hr = SHParseDisplayName(L"This PC\\Galaxy Tab A\\Card\\testfolder", NULL, &itemidlist, 0, NULL);
Run Code Online (Sandbox Code Playgroud)
回来0x80070002了HRESULT.
问题SHParseDisplayName当路径不存在这样一个问题涉及如何使用IBindCtx解析到一个并不存在的文件的路径.这可以使用STR_FILE_SYS_BIND_DATA绑定上下文来完成.但是移动设备上的对象不是文件系统数据,而且它们已经存在,所以我不明白为什么这是重复的.
我试图弄清楚如何获取卷 Guid 路径(例如“ \\?\Volume{50165421-0000-0000-0000-005d25000000}\”)的 PIDL(或 IShellItem 或 IShellFolder)。我希望能够从我的程序或其子对象上调用文件操作或 shell 上下文菜单项。如果它已安装并可通过驱动器号或文件夹访问,没问题,但我正在努力处理未安装的卷。
虽然 Windows 资源管理器的地址栏无法解析这些名称,但可以使用 run 命令(或使用 ShellExecute)打开 Windows 资源管理器:


一旦在 Windows 资源管理器中打开,它就可以很好地处理路径,即枚举和上下文菜单正常工作。
到目前为止我已经尝试过:
实际上,我没有检查很多 IBindCtx 选项,因为从文档中我不确定该用例应该尝试哪些选项。
在这里尝试了 @RbMm 共享的未记录的 IShellURL 接口- 它显示与 AddressBar 相同的错误消息框。
从卷管理参考中,我也没有看到 PIDL 的连接点。
使用带有 Process Monitor 的 ShellExecute 跟踪卷名称的开头,我看到 Windows 资源管理器正在访问
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\?\Volume{50165421-0000-0000-0000-005D25000000},就在打开“ \Device\HarddiskVolume3\”之前。但我什至不确定这是否相关。
有谁知道我还可以尝试什么?