WPD对象文件名在'.'处截断

mrg*_*g95 11 c++ qt wpd mtp

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

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

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;
Run Code Online (Sandbox Code Playgroud)

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

我似乎无法弄清楚出了什么问题.我误解了文件名实际上是怎么回事?对象example内是另一个属性还是其他东西com?我很困惑.

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

谢谢你的时间!

bla*_*pen 5

WPD应用程序编程参考是指以下3个名字.

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

WPD_OBJECT_NAME:设备上对象的名称.

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

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

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

这是图像

我用了:

    Windows Windows 7 Ultimate (without SP1)
    Visual Studio 2013
    Android 4.4.4 (Moto-E)
    Connection type: MTP
    Memory type: Internal Memory as well as External (SD Card)

如果它不适用于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
}
Run Code Online (Sandbox Code Playgroud)