Share via


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);
    }
}

IPortableDeviceContent2

IPortableDeviceProperties

WpdServicesApiSample