I use SHBrowseForFolder() to select a folder on MTP device. Then I want to copy file from/to there. IWMDMStorageControl interface (from Windows Media Format 11 SDK) seems suitable, but how to get it for the object with PIDL, returned from SHBrowseForFolder()?
(I asked similar question about obtaining IWMDMStorageControl interface: How to get IPortableDeviceContent interface for given PIDL)
We can get the displayed name, associated with the PILD from SHBrowseForFolder() in this way:
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]) );
}
}
Then we can parse the path and traverse through MTP file structure by the same path. It is not elegant solution, but it is the only one which I found.
来源:https://stackoverflow.com/questions/11433978/how-to-get-iwmdmstoragecontrol-interface-for-given-pidl