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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top