В моем проекте я использую 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 не может получить полное имя папки.
Спасибо за ваше время!
Справочник по программированию приложений 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
}
Других решений пока нет …