Festlegen von Eigenschaften für ein einzelnes Objekt
Nachdem Ihre Anwendung einen Objektbezeichner (siehe Thema Enumerating Content ) für ein bestimmtes Objekt abgerufen hat, kann sie Eigenschaften für dieses Objekt festlegen, indem methoden in den in der folgenden Tabelle beschriebenen Schnittstellen aufgerufen werden.
Schnittstelle | Beschreibung |
---|---|
IPortableDeviceProperties-Schnittstelle | Wird verwendet, um zu bestimmen, ob eine bestimmte Eigenschaft geschrieben werden kann, und um den Schreibvorgang zu senden. |
IPortableDeviceContent-Schnittstelle | Ermöglicht den Zugriff auf die inhaltsspezifischen Methoden. |
IPortableDeviceValues-Schnittstelle | Wird verwendet, um die zu schreibenden Werte zu speichern, ergebnisse des Schreibvorgangs zu bestimmen und Attribute von Eigenschaften abzurufen (beim Bestimmen der Schreibfunktion). |
Anwendungen legen Eigenschaften für ein Objekt fest, indem sie zunächst einen Eigenschaftenbehälter erstellen, der die neuen Werte mithilfe der IPortableDeviceValues-Schnittstelle angibt. Sobald der Eigenschaftenbehälter erstellt wurde, legt eine Anwendung diese Eigenschaften durch Aufrufen der IPortableDeviceProperties::SetValues-Methode fest.
Die WriteContentProperties
Funktion im Modul ContentProperties.cpp der Beispielanwendung veranschaulicht, wie eine Anwendung eine neue Objektnameneigenschaft für ein ausgewähltes Objekt festlegen kann.
Die erste Aufgabe, die von der WriteContentProperties
Funktion ausgeführt wird, besteht darin, den Benutzer aufzufordern, einen Objektbezeichner für das Objekt einzugeben, für das die Anwendung den neuen Namen schreibt.
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");
}
Danach ruft die Anwendung den WPD_PROPERTY_ATTRIBUTE_CAN_WRITE Wert für die WPD_OBJECT_NAME-Eigenschaft ab, um zu bestimmen, ob die Eigenschaft geschrieben werden kann. (Beachten Sie, dass Ihre Anwendung jede Eigenschaft festlegen kann, für die der WPD_PROPERTY_ATTRIBUTE_CAN_WRITE Wert true ist.)
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);
}
}
}
Der nächste Schritt besteht darin, den Benutzer zur Eingabe der neuen Namenszeichenfolge aufzufordern. (Beachten Sie, dass der Aufruf der IPortableDeviceValues::SetStringValue-Methode lediglich den Eigenschaftenbehälter erstellt; die tatsächliche Eigenschaft wurde noch nicht geschrieben.)
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);
}
}
}
}
Schließlich wird der vom Benutzer angegebene neue Wert auf das Objekt angewendet.
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);
}
}
Zugehörige Themen