Почему я не получаю WPD_OBJECT_ORIGINAL_FILE_NAME (т. е. имя файла) объекта на устройстве mtp

Я использую API WPD (портативные устройства Windows) в своей службе Windows для передачи файлов из папки на устройстве mtp в указанную папку на моем жестком диске.

В целях тестирования я создаю файл xyzdata.txt в папке на устройстве mtp. Итак, когда код достигает точки, где он делает это:

    hr = content->Properties(&properties);
    if (SUCCEEDED(hr))
    {
        hr = GetStringValue(properties.Get(),
             selection,
             WPD_OBJECT_ORIGINAL_FILE_NAME,
             &originalFileName);
    }

«hr» заполнен «ERROR_BUSY», а originalFileName вообще не задан. Есть ли причина, по которой WPD_OBJECT_ORIGINAL_FILE_NAME не может быть установлен для некоторых объектов, или это проблема с получением данных?

Любая помощь будет неоценимой. Если вам нужно больше кода, я опубликую его здесь.

Редактировать:

Код ошибки,

hr = HRESULT_FROM_WIN32(ERROR_BUSY): запрошенный ресурс используется.

Кроме того, устройство является устройством Android. И иногда, когда мы подключаем USB-кабель обратно, имя файла доступно. Но это редкость. Пожалуйста, дайте мне знать, что происходит


person sp497    schedule 15.12.2015    source источник


Ответы (1)


Нашел решение.

Проблема заключалась в том, что вызов GetStream() не завершался до того, как я вызвал GetStringValue().

Так как вызов функции GetStringValue() не имел никакой зависимости от GetStream(), я просто переупорядочил их и вуаля, все заработало.

person sp497    schedule 15.12.2015
comment
MTP очень хрупкий и невероятно последовательный по своей природе. - person Jonathan Potter; 15.12.2015