Abrufen von WPD-Objekteigenschaften
Dienste enthalten häufig untergeordnete Objekte, die zu einem der Formate gehören, die jeder Dienst unterstützt. Ein Kontaktdienst kann beispielsweise mehrere Kontaktobjekte des Abstrakten Kontaktformats unterstützen. Jedes Kontaktobjekt wird durch verwandte Eigenschaften beschrieben (Kontaktname, Telefonnummer, E-Mail-Adresse usw.).
Die WpdServiceApiSample-Anwendung enthält Code, der veranschaulicht, wie eine Anwendung die inhaltsobjekteigenschaften abrufen kann, die von einem bestimmten Kontaktdienst unterstützt werden. In diesem Beispiel werden die folgenden Schnittstellen verwendet.
Schnittstelle | BESCHREIBUNG |
---|---|
IPortableDeviceService | Ruft die IPortableDeviceContent2-Schnittstelle ab, um auf die unterstützten Dienstmethoden zuzugreifen. |
IPortableDeviceContent2 | Bietet Zugriff auf die inhaltsspezifischen Methoden. |
IPortableDeviceProperties | Ruft die Objekteigenschaftswerte ab. |
IPortableDeviceValues | Enthält die Eigenschaftenwerte, die für dieses Objekt gelesen wurden. |
IPortableDeviceKeyCollection | Enthält die Parameter für eine bestimmte Methode. |
Wenn der Benutzer die Option "7" in der Befehlszeile wählt, ruft die Anwendung die ReadContentProperties-Methode auf, die im ContentProperties.cpp-Modul gefunden wird.
Diese Methode ruft die folgenden vier Eigenschaften für das angegebene Kontaktobjekt ab.
Eigenschaft | BESCHREIBUNG | Device Services-EIGENSCHAFTKEY | Gleichwertige WPD_PROPERTYKEY |
---|---|---|---|
Übergeordneter Objektbezeichner | Eine Zeichenfolge, die den Bezeichner für das übergeordnete Objekt angibt. | PKEY_GenericObj_ParentID | WPD_OBJECT_PARENT_ID |
Objektname | Eine Zeichenfolge, die den Namen des angegebenen Objekts angibt. | PKEY_GenericObj_Name | WPD_OBJECT_NAME |
Beständiger eindeutiger Bezeichner | Eine Zeichenfolge, die einen eindeutigen Bezeichner für das angegebene Objekt angibt. Dieser Bezeichner ist über Sitzungen hinweg beständig, anders als der Objektbezeichner. Für Dienste muss dies eine Zeichenfolgendarstellung einer GUID sein. | PKEY_GenericObj_PersistentUID | WPD_OBJECT_PERSISTENT_UNIQUE_ID |
Objektformat | Ein global eindeutiger Bezeichner (GUID), der das Format der Datei angibt, das einem bestimmten Objekt entspricht. | PKEY_GenericObj_ObjectFormat | WPD_OBJECT_FORMAT |
- Übergeordnete ID
- Name
- PersistentUID
- Format
Beachten Sie, dass vor dem Abrufen der Inhaltseigenschaften die Beispielanwendung einen Kontaktdienst auf einem verbundenen Gerät öffnet.
Der folgende Code für die ReadContentProperties-Methode veranschaulicht, wie die Anwendung die IPortableDeviceContent2-Schnittstelle verwendet, um eine IPortableDeviceProperties-Schnittstelle abzurufen. Durch Übergeben der PROPERTYKEYS der angeforderten Eigenschaften an die IPortableDeviceProperties::GetValues-Methode ruft ReadContentProperties die angeforderten Werte ab, und zeigt sie dann im Konsolenfenster an.
// 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);
}
}
Zugehörige Themen