Подтвердить что ты не робот

Имя файла WPD Object Усечено в '.'

В моем проекте я использую API Windows Portable Device (WPD) для перечисления содержимого мобильного устройства. Руководство по перечислению API WPD. Я могу перечислить каждый объект и просмотреть его свойства, как показано в руководстве по программированию API. Руководство по API API WPD

Однако, когда я пытаюсь получить имя объекта с . внутри имени, возвращаемое значение усекается при этом .

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? Я очень смущен.

EDIT: Поэтому я использовал образец программного обеспечения WPD API для извлечения всех свойств объекта объекта com.example, и вы можете видеть, что сам WPD не может получить полное имя папки. введите описание изображения здесь

Спасибо за ваше время!

4b9b3361

Ответ 1

Справочник по программированию приложений WPD ссылается на 3 ИМЯ.

WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME: более дружелюбное имя, в основном предназначенное для отображения

WPD_OBJECT_NAME: имя объекта на устройстве.

WPD_OBJECT_ORIGINAL_FILE_NAME: исходное имя файла на устройстве.

Пример кода MS в С++ использует WPD_OBJECT_ORIGINAL_FILE_NAME для доступа к фактическому имени файла (под объектом) при передаче файлов с устройства на ПК.

Я изменил образец кода 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 Mass Storage).


Вот часть кода, которую я модифицировал (и вот как это работает).

// 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
}