Имя файла объекта WPD усечено до ‘.’

В моем проекте я использую API переносного устройства Windows (WPD) для перечисления содержимого мобильного устройства. Руководство по перечислению 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 объект? Я очень смущен.

РЕДАКТИРОВАТЬ:
Поэтому я использовал пример программного обеспечения API WPD для получения всех свойств объекта com.example, и вы можете видеть, что сам WPD не может получить полное имя папки. введите описание изображения здесь

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

11

Решение

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

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

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

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

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

Я изменил пример кода MS (для перечисления свойств объекта), и он показал мне фактическое имя файла (ничего не усечено из имени файла com.ef1.first.second)

Вот изображение

Я использовал:

Windows Windows 7 Ultimate (без пакета обновления 1)
Visual Studio 2013
Android 4.4.4 (Moto-E)
Тип подключения: MTP
Тип памяти: внутренняя и внешняя память (SD-карта)

Я не удивлюсь, если это не сработает на некоторых комбинациях версий 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
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]