単一オブジェクトのプロパティの設定
アプリケーションが特定のオブジェクトのオブジェクト識別子 (「 コンテンツの列挙 」トピックを参照) を取得した後、次の表で説明するインターフェイスでメソッドを呼び出すことによって、そのオブジェクトのプロパティを設定できます。
インターフェイス | 説明 |
---|---|
IPortableDeviceProperties インターフェイス | 特定のプロパティを書き込むことができるかどうかを判断し、書き込み操作を送信するために使用します。 |
IPortableDeviceContent インターフェイス | コンテンツ固有のメソッドへのアクセスを提供します。 |
IPortableDeviceValues インターフェイス | 書き込まれる値を保持し、書き込み操作の結果を決定し、プロパティの属性を取得するために使用されます (書き込み機能を決定する場合)。 |
アプリケーションは、最初に IPortableDeviceValues インターフェイスを使用して新しい値を指定するプロパティ バッグを作成することによって、オブジェクトにプロパティを設定します。 プロパティ バッグが作成されると、アプリケーションは IPortableDeviceProperties::SetValues メソッドを呼び出してこれらのプロパティを設定します。
サンプル アプリケーションの ContentProperties.cpp モジュールの 関数は WriteContentProperties
、選択したオブジェクトの新しいオブジェクト名プロパティをアプリケーションで設定する方法を示しています。
関数によって実行される最初の WriteContentProperties
タスクは、アプリケーションが新しい名前を書き込むオブジェクトのオブジェクト識別子を入力するようにユーザーに求めます。
HRESULT hr = S_OK;
WCHAR szSelection[81] = {0};
WCHAR szNewObjectName[81] = {0};
CComPtr<IPortableDeviceProperties> pProperties;
CComPtr<IPortableDeviceContent> pContent;
CComPtr<IPortableDeviceValues> pObjectPropertiesToWrite;
CComPtr<IPortableDeviceValues> pPropertyWriteResults;
CComPtr<IPortableDeviceValues> pAttributes;
BOOL bCanWrite = FALSE;
// Prompt user to enter an object identifier on the device to write properties on.
printf("Enter the identifer of the object you wish to write properties on.\n>");
hr = StringCbGetsW(szSelection,sizeof(szSelection));
if (FAILED(hr))
{
printf("An invalid object identifier was specified, aborting property reading\n");
}
その後、アプリケーションは WPD_OBJECT_NAME プロパティのWPD_PROPERTY_ATTRIBUTE_CAN_WRITE値を取得して、プロパティを書き込むことができるかどうかを判断します。 (アプリケーションでは、WPD_PROPERTY_ATTRIBUTE_CAN_WRITE値が true である任意のプロパティを設定できることに注意してください)。
if (SUCCEEDED(hr))
{
hr = pDevice->Content(&pContent);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 2) Get an IPortableDeviceProperties interface from the IPortableDeviceContent interface
// to access the property-specific methods.
if (SUCCEEDED(hr))
{
hr = pContent->Properties(&pProperties);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceProperties from IPortableDevice, hr = 0x%lx\n",hr);
}
}
// 3) Check the property attributes to see if we can write/change the WPD_OBJECT_NAME property.
if (SUCCEEDED(hr))
{
hr = pProperties->GetPropertyAttributes(szSelection,
WPD_OBJECT_NAME,
&pAttributes);
if (SUCCEEDED(hr))
{
hr = pAttributes->GetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, &bCanWrite);
if (SUCCEEDED(hr))
{
if (bCanWrite)
{
printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for the WPD_OBJECT_NAME reports TRUE\nThis means that the property can be changed/updated\n\n");
}
else
{
printf("The attribute WPD_PROPERTY_ATTRIBUTE_CAN_WRITE for the WPD_OBJECT_NAME reports FALSE\nThis means that the property cannot be changed/updated\n\n");
}
}
else
{
printf("! Failed to get the WPD_PROPERTY_ATTRIBUTE_CAN_WRITE value from WPD_OBJECT_NAME on object '%ws', hr = 0x%lx\n",szSelection, hr);
}
}
}
次の手順では、ユーザーに新しい名前文字列の入力を求めます。 ( IPortableDeviceValues::SetStringValue メソッドの呼び出しは、単にプロパティ バッグを作成するだけです。実際のプロパティはまだ書き込まれていません)。
if (bCanWrite)
{
printf("Enter the new WPD_OBJECT_NAME for the object '%ws'.\n>",szSelection);
hr = StringCbGetsW(szNewObjectName,sizeof(szNewObjectName));
if (FAILED(hr))
{
printf("An invalid object name was specified, aborting property writing\n");
}
// 5) CoCreate an IPortableDeviceValues interface to hold the property values
// we wish to write.
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pObjectPropertiesToWrite));
if (SUCCEEDED(hr))
{
if (pObjectPropertiesToWrite != NULL)
{
hr = pObjectPropertiesToWrite->SetStringValue(WPD_OBJECT_NAME, szNewObjectName);
if (FAILED(hr))
{
printf("! Failed to add WPD_OBJECT_NAME to IPortableDeviceValues, hr= 0x%lx\n", hr);
}
}
}
}
最後に、ユーザーによって指定された新しい値が オブジェクトに適用されます。
if (SUCCEEDED(hr))
{
hr = pProperties->SetValues(szSelection, // The object whose properties we are reading
pObjectPropertiesToWrite, // The properties we want to read
&pPropertyWriteResults); // Driver supplied property result values for the property read operation
if (FAILED(hr))
{
printf("! Failed to set properties for object '%ws', hr= 0x%lx\n", szSelection, hr);
}
else
{
printf("The WPD_OBJECT_NAME property on object '%ws' was written successfully (Read the properties again to see the updated value)\n", szSelection);
}
}
関連トピック