11

在我的项目中,我使用 Windows 便携式设备 (WPD) API 来枚举移动设备的内容。WPD API 枚举指南。我能够枚举每个对象并查看它们的属性,如 API 编程指南中所示。WPD API 属性指南

但是,当我尝试获取名称中包含 a 的对象.名称时,返回的值会被截断.

HRESULT hr = objectProperties->GetStringValue(WPD_OBJECT_NAME, &strOriginalFileName);
if(FAILED(hr))
    return false;

PWSTR wideStr = strOriginalFileName;
char buffer[20];
wcstombs(buffer, wideStr, 20);

qDebug() << buffer;

例如,名称为 的对象(设备上的文件夹)com.example返回为com. 当我尝试在设备上查找特定文件路径时,这成为一个明显的问题。

我似乎无法弄清楚出了什么问题。我是否误解了文件名的实际含义?对象内是否有example其他属性或某物com?我很困惑。

编辑:所以我使用 WPD API 示例软件来检索 com.example 对象的所有对象属性,您可以看到 WPD 本身无法获取完整的文件夹名称。在此处输入图像描述

谢谢你的时间!

4

1 回答 1

5

WPD 应用程序编程参考引用了以下3 个名称。

WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME:更友好的名称,主要用于显示

WPD_OBJECT_NAME:设备上对象的名称。

WPD_OBJECT_ORIGINAL_FILE_NAME:设备上对象的原始文件名。

C++ 中的 MS 代码示例在将文件从设备传输到 PC 时使用WPD_OBJECT_ORIGINAL_FILE_NAME获取实际文件名(在对象下方)。

我修改了 MS 代码示例(以枚举对象属性),它向我显示了实际的文件名(没有从文件名中截断com.ef1.first.second

这是图像

我用了:

    Windows Windows 7 Ultimate(无 SP1)
    视觉工作室 2013
    安卓 4.4.4 (Moto-E)
    连接类型:MTP
    内存类型:内部存储器以及外部(SD 卡)

如果它不适用于 Windows 版本、Windows SDK 版本、android 版本、连接类型(MTP、PTP、USB 大容量存储)的某些组合,我不会感到惊讶。


这是我修改的部分代码(这就是它的工作方式)。

// Reads properties for the user specified object.
void ReadContentProperties(_In_ IPortableDevice* device)
{
   //.... Edited for brevity
   tempHr = propertiesToRead->Add(WPD_OBJECT_NAME);
   if (FAILED(tempHr))
   {
      wprintf(L"! Failed to add WPD_OBJECT_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", tempHr);
   }

   // Here is the added code
   tempHr = propertiesToRead->Add(WPD_OBJECT_ORIGINAL_FILE_NAME);
   if (FAILED(tempHr))
   {
      wprintf(L"! Failed to add WPD_OBJECT_ORIGINAL_FILE_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", tempHr);
   }
    //.... Edited for brevity
}
于 2016-11-05T23:15:49.960 回答