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

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

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

【问题讨论】:

  • 起点完全错误,MTP 确实 授予对文件系统的访问权限。 differencebetween.net/technology/difference-between-mtp-and-msc
  • 我知道,这就是为什么我询问 IWMDMStorageControl 接口,而不是常规 FileCopy。我只需要知道如何通过 SHBrowseForFolder 和 WMDM 或 WPD 接口/方法在用户选择之间建立对应关系。在 Win.Explorer 或 SHBrowseForFolder 中,用户可以在 MTP 设备(在我的情况下为三星平板电脑)上看到常规的树结构,就像磁盘驱动器一样。如果不使用 SHBrowseForFolder,如何在那里选择文件夹?
  • 实际上它是这些设备上的真实文件系统。整个问题是他们不提供 USB 驱动模式,而只提供 MTP 或 PTP。
  • 您是否找到一种方法来至少检索与 SHBrowseForFolder() 为所选 MTP 文件夹返回的 PILD 关联的显示名称?
  • 是的,我会把代码作为答案。

标签: c++ windows interface 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
    相关资源
    最近更新 更多