如何获得IPortableDeviceContent接口给出PIDL(How to get IPor

2019-10-16 23:42发布

我使用的SHBrowseForFolder()来选择MTP设备上的文件夹。 然后,我想从/到那里复制文件。 IPortableDeviceContent接口(从Windows便携设备SDK)似乎合适的,但是如何得到它与PIDL的对象,从的SHBrowseForFolder()返回?

(我问类似的问题,如何获得IWMDMStorageControl接口: 如何获得IWMDMStorageControl接口给出PIDL )

Answer 1:

我们可以得到所显示的名字,从的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文件结构遍历。 它不是完美的解决方案,但它是唯一一个我发现。



文章来源: How to get IPortableDeviceContent interface for given PIDL