我使用SHBrowseForFolder()在MTP设备上select一个文件夹。 然后我想从/复制文件到那里。 IWMDMStorageControl接口(从Windows媒体格式11 SDK)似乎是合适的,但如何获得与PIDL的对象,从SHBrowseForFolder()返回?
(我问了关于获取IWMDMStorageControl接口的类似问题: 如何获得给定PIDL的IPortableDeviceContent接口 )
我们可以通过这种方式得到与SHBrowseForFolder()中的PILD关联的显示名称:
TCHAR DisplayName[MAX_PATH]; // we will get it here LPITEMIDLIST pidlSelected = SHBrowseForFolder( &bi ); if ( pidlSelected && ! SHGetPathFromIDList(pidlSelected, DisplayName) ) { // it is media device IShellFolder *psfParent; LPCITEMIDLIST pidlRelative; STRRET str; HRESULT hres = SHBindToParent(pidlSelected, IID_IShellFolder, (void**)&psfParent, &pidlRelative); if (SUCCEEDED(hres)) { psfParent->GetDisplayNameOf( pidlRelative, SHGDN_FORADDRESSBAR, &str ); psfParent->Release(); StrRetToBuf( &str, pidlSelected, DisplayName, sizeof(DisplayName)/sizeof(DisplayName[0]) ); } }
然后我们可以通过相同的路径解析路径并遍历MTP文件结构。 这不是优雅的解决方案,但它是我找到的唯一解决方案。