Win32 C++ Перечисление файловой системы «внутреннего хранилища» таких устройств, как iPhone и цифровая камера MTP-USB.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Win32 C++ Перечисление файловой системы «внутреннего хранилища» таких устройств, как iPhone и цифровая камера MTP-USB.

Сообщение Anonymous »

Чтобы перечислить содержимое подключенных устройств, таких как iPhone и цифровая камера, подключенных через MTP (USB), которые не являются простыми файловыми дисками, я рассмотрел пример примера WPD API. Соответствующий файл — ContentEnumeration.cpp.
Обычно код:

Код: Выделить всё

HRESULT                         hr = S_OK;
CComPtr pContent;
hr = pDevice->Content(&pContent);
RecursiveEnumerate(WPD_DEVICE_OBJECT_ID, pContent);
с RecursiveEnumerate, определенным как:

Код: Выделить всё

void RecursiveEnumerate(
PCWSTR                  pszObjectID,
IPortableDeviceContent* pContent)
{
CComPtr pEnumObjectIDs;

// Print the object identifier being used as the parent during enumeration.
printf("%ws\n",pszObjectID);

HRESULT hr = pContent->EnumObjects(0,               // Flags are unused
pszObjectID,     // Starting from the passed in object
NULL,            // Filter is unused
&pEnumObjectIDs);
// Loop calling Next() while S_OK is being returned.
while(hr == S_OK)
{
DWORD  cFetched = 0;
PWSTR  szObjectIDArray[NUM_OBJECTS_TO_REQUEST] = {0};
hr = pEnumObjectIDs->Next(NUM_OBJECTS_TO_REQUEST,   // Number of objects to request on each NEXT call
szObjectIDArray,          // Array of PWSTR array which will be populated on each NEXT call
&cFetched);               // Number of objects written to the PWSTR array
if (SUCCEEDED(hr))
{
// Traverse the results of the Next() operation and recursively enumerate
// Remember to free all returned object identifiers using CoTaskMemFree()
for (DWORD dwIndex = 0; dwIndex < cFetched; dwIndex++)
{
RecursiveEnumerate(szObjectIDArray[dwIndex],pContent);

// Free allocated PWSTRs after the recursive enumeration call has completed.
CoTaskMemFree(szObjectIDArray[dwIndex]);
szObjectIDArray[dwIndex] = NULL;
}
}
}
}
Для простых подключенных USB-накопителей это дает правильное содержимое файла/папки, но для iPhone и устройств MTP-USB это не так. Для этих устройств результат будет

Код: Выделить всё

o9900
o98FF
o98FE
o98FD
etc.
Проводник Windows позволяет разворачивать эти устройства для отображения псевдопапки «Внутреннее хранилище» или «Хранилище устройства», а дочерние объекты этой папки представляют собой настоящие папки, такие как 202403_, и файлы под ними, которыми можно манипулировать. Кто-нибудь знает, как можно получить доступ к реальному содержимому?


Подробнее здесь: https://stackoverflow.com/questions/797 ... iphone-and
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»