WPD オブジェクトのプロパティの取得
多くの場合、サービスには、各サービスがサポートする形式のいずれかに属する子オブジェクトが含まれています。 たとえば、連絡先サービスは、抽象連絡先形式の複数の連絡先オブジェクトをサポートする場合があります。 各連絡先オブジェクトは、関連するプロパティ (連絡先名、電話番号、メール アドレスなど) によって記述されます。
WpdServiceApiSample アプリケーションには、アプリケーションが特定の Contacts サービスでサポートされている content-object プロパティを取得する方法を示すコードが含まれています。 このサンプルでは、次のインターフェイスを使用します。
インターフェイス | 説明 |
---|---|
IPortableDeviceService | サポートされているサービス メソッドにアクセスするための IPortableDeviceContent2 インターフェイスを取得します。 |
IPortableDeviceContent2 | コンテンツ固有のメソッドへのアクセスを提供します。 |
IPortableDeviceProperties | オブジェクト プロパティの値を取得します。 |
IPortableDeviceValues | そのオブジェクトに対して読み取られたプロパティ値を保持します。 |
IPortableDeviceKeyCollection | 特定のメソッドのパラメーターを格納します。 |
ユーザーがコマンド ラインでオプション "7" を選択すると、アプリケーションは ContentProperties.cpp モジュールにある ReadContentProperties メソッドを呼び出します。
このメソッドは、指定された連絡先オブジェクトの次の 4 つのプロパティを取得します。
プロパティ | 説明 | Device Services PROPERTYKEY | 同等のWPD_PROPERTYKEY |
---|---|---|---|
親オブジェクト識別子 | 指定されたオブジェクトの親の識別子を指定する文字列。 | PKEY_GenericObj_ParentID | WPD_OBJECT_PARENT_ID |
オブジェクト名 | 指定されたオブジェクトの名前を指定する文字列 | PKEY_GenericObj_Name | WPD_OBJECT_NAME |
永続的な一意識別子 | 指定したオブジェクトの一意識別子を指定する文字列。 この識別子は、オブジェクト識別子とは異なり、セッション間で永続的です。 サービスの場合、これは GUID の文字列表現である必要があります。 | PKEY_GenericObj_PersistentUID | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
オブジェクトの形式 | 特定のオブジェクトに対応するファイルの形式を指定するグローバル一意識別子 (GUID) | PKEY_GenericObj_ObjectFormat | WPD_OBJECT_FORMAT |
- 親 ID
- Name
- PersistentUID
- フォーマット
コンテンツ プロパティを取得する前に、サンプル アプリケーションは接続されているデバイスで連絡先サービスを開きます。
ReadContentProperties メソッドの次のコードは、アプリケーションが IPortableDeviceContent2 インターフェイスを使用して IPortableDeviceProperties インターフェイスを取得する方法を示しています。 要求されたプロパティの PROPERTYKEYS を IPortableDeviceProperties::GetValues メソッドに渡すことで、 ReadContentProperties は要求された値を取得し、コンソール ウィンドウに表示します。
// Reads properties for the user specified object.
void ReadContentProperties(
IPortableDeviceService* pService)
{
if (pService == NULL)
{
printf("! A NULL IPortableDeviceService interface pointer was received\n");
return;
}
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IPortableDeviceValues> pObjectProperties;
CComPtr<IPortableDeviceContent2> pContent;
CComPtr<IPortableDeviceKeyCollection> pPropertiesToRead;
// Prompt user to enter an object identifier on the device to read properties from.
printf("Enter the identifer of the object you wish to read properties from.\n>");
hr = StringCbGetsW(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting property reading\n");
}
// 1) Get an IPortableDeviceContent2 interface from the IPortableDeviceService interface to
// access the content-specific methods.
if (SUCCEEDED(hr))
{
hr = pService->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent2 from IPortableDeviceService, hr = 0x%lx\n",hr);
}
}
// 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent2 interface
// to access the property-specific methods.
if (SUCCEEDED(hr))
{
hr = pContent->Properties(&pProperties);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceProperties from IPortableDeviceContent2, hr = 0x%lx\n",hr);
}
}
// 3) CoCreate an IPortableDeviceKeyCollection interface to hold the property keys
// we wish to read.
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(PKEY_GenericObj_ParentID);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_ParentID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_Name);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_Name to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_PersistentUID);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_PersistentUID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
hrTemp = pPropertiesToRead->Add(PKEY_GenericObj_ObjectFormat);
if (FAILED(hrTemp))
{
printf("! Failed to add PKEY_GenericObj_ObjectFormat to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
}
}
}
// 5) Call GetValues() passing the collection of specified PROPERTYKEYs.
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);
}
}
// 6) Display the returned property values to the user
if (SUCCEEDED(hr))
{
DisplayStringProperty(pObjectProperties, PKEY_GenericObj_ParentID, NAME_GenericObj_ParentID);
DisplayStringProperty(pObjectProperties, PKEY_GenericObj_Name, NAME_GenericObj_Name);
DisplayStringProperty(pObjectProperties, PKEY_GenericObj_PersistentUID, NAME_GenericObj_PersistentUID);
DisplayGuidProperty (pObjectProperties, PKEY_GenericObj_ObjectFormat, NAME_GenericObj_ObjectFormat);
}
}
関連トピック