単一オブジェクトのプロパティの取得
アプリケーションは、特定のオブジェクトのオブジェクト識別子 (「コンテンツの列挙」トピックを参照) を取得した後、IPortableDeviceProperties インターフェイスと IPortableDeviceKeyCollection インターフェイスでメソッドを呼び出すことによって、そのオブジェクトに関する説明情報を取得できます。
IPortableDeviceProperties::GetValues メソッドは、指定されたオブジェクトの指定されたプロパティの一覧を取得します。 (アプリケーションで GetValues メソッドを呼び出し、特定のオブジェクトのすべてのプロパティを取得するために pKeys パラメーターに NULL 値を指定することもできます。ただし、すべてのプロパティを取得する場合、このメソッドのパフォーマンスが大幅に低下する可能性があります)。
ただし、アプリケーションが GetValues を呼び出す前に、 IPortableDeviceKeyCollection オブジェクトに対応するキーを設定して取得するプロパティを識別する必要があります。 アプリケーションは、 IPortableDeviceKeyCollection::Add メソッドを呼び出し、取得する各プロパティを識別する PROPERTYKEY 値を指定することで、目的のプロパティを識別します。
サンプル アプリケーションの ContentProperties.cpp モジュールの ReadContentProperties 関数は、選択したオブジェクトに対して 5 つのプロパティがどのように取得されたかを示しています。 次の表では、これらの各プロパティとそれに対応する REFPROPERTYKEY 値について説明します。
プロパティ | 説明 | PROPERTYKEY |
---|---|---|
親オブジェクト識別子 | 指定されたオブジェクトの親の識別子を指定する文字列。 | WPD_OBJECT_PARENT_ID |
オブジェクト名 | 指定したオブジェクトの名前を指定する文字列。 | WPD_OBJECT_NAME |
永続的な一意識別子 | 指定したオブジェクトの一意識別子を指定する文字列。 (この識別子は、オブジェクト識別子とは異なり、セッション間で永続的です)。 | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
オブジェクトの形式 | 特定のオブジェクトに対応するファイルの形式を指定するグローバル一意識別子 (GUID)。 | WPD_OBJECT_FORMAT |
オブジェクト コンテンツ タイプ | 特定のオブジェクトに関連付けられているコンテンツの種類を指定する GUID。 | WPD_OBJECT_CONTENT_TYPE |
ReadContentProperties 関数からの次の抜粋は、サンプル アプリケーションが IPortableDeviceKeyCollection インターフェイス と IPortableDeviceKeyCollection::Add メソッドを使用して取得するプロパティを識別する方法を示しています。
hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPropertiesToRead));
if (SUCCEEDED(hr))
{
// 4) Populate the IPortableDeviceKeyCollection with the keys we wish to read.
// NOTE: We are not handling any special error cases here so we can proceed with
// adding as many of the target properties as we can.
if (pPropertiesToRead != NULL)
{
HRESULT hrTemp = S_OK;
hrTemp = pPropertiesToRead->Add(WPD_OBJECT_PARENT_ID);
if (FAILED(hrTemp))
{
printf("! Failed to add WPD_OBJECT_PARENT_ID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(WPD_OBJECT_NAME);
if (FAILED(hrTemp))
{
printf("! Failed to add WPD_OBJECT_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(WPD_OBJECT_PERSISTENT_UNIQUE_ID);
if (FAILED(hrTemp))
{
printf("! Failed to add WPD_OBJECT_PERSISTENT_UNIQUE_ID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(WPD_OBJECT_FORMAT);
if (FAILED(hrTemp))
{
printf("! Failed to add WPD_OBJECT_FORMAT to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(WPD_OBJECT_CONTENT_TYPE);
if (FAILED(hrTemp))
{
printf("! Failed to add WPD_OBJECT_CONTENT_TYPE to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
}
}
サンプル アプリケーションが適切なキーを設定したら、 IPortableDeviceProperties::GetValues メソッドを呼び出して、指定されたオブジェクトの指定した値を取得します。
if (SUCCEEDED(hr))
{
hr = pProperties->GetValues(szSelection, // The object whose properties we are reading
pPropertiesToRead, // The properties we want to read
&pObjectProperties); // Driver supplied property values for the specified object
if (FAILED(hr))
{
printf("! Failed to get all properties for object '%ws', hr= 0x%lx\n", szSelection, hr);
}
}
関連トピック