11

私のプロジェクトでは、Windows Portable Device (WPD) API を使用して、モバイル デバイスのコンテンツを列挙しています。WPD API 列挙ガイド。API プログラミング ガイドに示されているように、各オブジェクトを列挙し、それらのプロパティを表示できます。WPD API プロパティ ガイド

ただし、名前に が含まれるオブジェクトの名前を取得しようとすると.、返される値はその位置で切り捨てられます.

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私はとても混乱しています。

編集: そこで、WPD API サンプル ソフトウェアを使用して com.example オブジェクトのすべてのオブジェクト プロパティを取得しました。WPD 自体が完全なフォルダー名を取得できないことがわかります。ここに画像の説明を入力

御時間ありがとうございます!

4

1 に答える 1

5

WPD アプリケーション プログラミング リファレンスでは、次の 3 つの名前を参照しています。

WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME: わかりやすい名前で、主に表示用です

WPD_OBJECT_NAME: デバイス上のオブジェクトの名前。

WPD_OBJECT_ORIGINAL_FILE_NAME: デバイス上のオブジェクトの元のファイル名。

C++ の MS コード サンプルは、デバイスから PC にファイルを転送する際に、WPD_OBJECT_ORIGINAL_FILE_NAMEを使用して実際のファイル名 (オブジェクトの下) を取得します。

MS コード サンプルを (オブジェクト プロパティを列挙するために) 変更したところ、実際のファイル名が表示されました (ファイル名から切り捨てられたものは何もありませんcom.ef1.first.second) 。

画像はこちら

私が使用した:

    Windows Windows 7 Ultimate (SP1 なし)
    ビジュアル スタジオ 2013
    Android 4.4.4 (Moto-E)
    接続タイプ: MTP
    メモリの種類: 内部メモリと外部 (SD カード)

Windows バージョン、Windows SDK バージョン、Android バージョン、接続タイプ (MTP、PTP、USB 大容量ストレージ) の組み合わせで動作しなくても驚かないでしょう。


これが私が修正したコードの一部です (それがどのように機能したかです)。

// 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
}
于 2016-11-05T23:15:49.960 に答える