【问题标题】:How to get IPortableDeviceContent interface for given PIDL如何获取给定 PIDL 的 IPortableDeviceContent 接口
【发布时间】:2012-07-11 03:52:06
【问题描述】:

我使用 SHBrowseForFolder() 在 MTP 设备上选择一个文件夹。然后我想从那里复制文件。 IPortableDeviceContent 接口(来自 Windows Portable Devices SDK)似乎很合适,但是如何从 SHBrowseForFolder() 返回的带有 PIDL 的对象获取它?

(我问过关于获取 IWMDMStorageControl 接口的类似问题: How to get IWMDMStorageControl interface for given PIDL)

【问题讨论】:

  • 您是否找到了一种方法来至少检索与 SHBrowseForFolder() 为所选 MTP 文件夹返回的 PILD 关联的显示名称?
  • 是的。这样:TCHAR DisplayName[MAX_PATH]; // 我们会在这里得到它 LPITEMIDLIST pidlSelected = SHBrowseForFolder(&bi); if (pidlSelected && !SHGetPathFromIDList(pidlSelected, DisplayName)) { // 它是媒体设备 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])); } }
  • 对不起,这里没有格式化,我也将代码作为常规注释。

标签: c++ windows interface wpd mtp


【解决方案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文件结构。这不是优雅的解决方案,但它是我发现的唯一一个。

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2011-10-31
    相关资源
    最近更新 更多