I use SHBrowseForFolder() to select a folder on MTP device. Then I want to copy file from/to there. IPortableDeviceContent interface (from Windows Portable Devices 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 IWMDMStorageControl 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.