1

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)

Community
  • 1
  • 1
ggurov
  • 1,496
  • 2
  • 15
  • 21
  • Did you find a way to at least retreive the displayed name associated with the PILD returned by SHBrowseForFolder() for the selected MTP folder ? – Regis St-Gelais Jan 18 '13 at 16:32
  • Yes. 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])); } } – ggurov Jan 19 '13 at 19:42
  • Sorry about lack of formatting here, I will place the code as regular comment also. – ggurov Jan 19 '13 at 19:43

1 Answers1

1

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.

ggurov
  • 1,496
  • 2
  • 15
  • 21