Freigeben über


Abrufen unterstützter Dienstformate

Die WpdServicesApiSample-Anwendung enthält Code, der veranschaulicht, wie eine Anwendung die von einem bestimmten Contacts-Dienst unterstützten Formate abrufen kann, indem Methoden der Schnittstellen in der folgenden Tabelle aufgerufen werden.

Schnittstelle BESCHREIBUNG
IPortableDeviceService Wird verwendet, um die IPortableDeviceServiceCapabilities-Schnittstelle abzurufen, um auf die unterstützten Ereignisse zuzugreifen.
IPortableDeviceServiceCapabilities Bietet Zugriff auf die unterstützten Ereignisse und Ereignisattribute.
IPortableDevicePropVariantCollection Enthält die Liste der unterstützten Formate.
IPortableDeviceValues Enthält die Attribute für ein bestimmtes Format.

 

Wenn der Benutzer die Option "3" an der Befehlszeile wählt, ruft die Anwendung die ListSupportedFormats-Methode auf, die im Modul ServiceCapabilities.cpp gefunden wird.

Beachten Sie, dass die Beispielanwendung vor dem Abrufen der Ereignisliste einen Contacts-Dienst auf einem verbundenen Gerät öffnet.

In WPD wird ein Format durch Attribute beschrieben, die den Namen und (optional) den MIME-Typ eines bestimmten Formats angeben. Diese Attribute werden in der HeaderdateiPortableDevice.h definiert. Eine Beschreibung der unterstützten Attribute finden Sie im Thema Attribute .

Wenn im Fall der Beispielanwendung wpdServiceSampleDriver das einzige installierte Gerät ist, gibt der Treiber zwei unterstützte Formate für den Contact-Dienst zurück: "AbstractContactFormat" und "VCard2Format". Diese Formate entsprechen dem WPD_OBJECT_FORMAT_ABSTRACT_CONTACT und den WPD_OBJECT_FORMAT_VCARD2 Attributen in PortableDevice.h.

Zwei Methoden im Modul ServiceCapabilities.cpp unterstützen das Abrufen unterstützter Formate für den Kontaktdienst: ListSupportedFormats und DisplayFormat. Erstere ruft den GUID-Bezeichner für jedes unterstützte Format ab. Letztere konvertiert diese GUID in eine benutzerfreundliche Zeichenfolge.

Die ListSupportedFormats-Methode ruft die IPortableDeviceService::Capabilities-Methode auf, um eine IPortableDeviceServiceCapabilities-Schnittstelle abzurufen. Mithilfe dieser Schnittstelle werden die unterstützten Formate abgerufen, indem die IPortableDeviceServiceCapabilities::GetSupportedFormats-Methode aufgerufen wird. Die GetSupportedFormats-Methode ruft die GUID für jedes vom Dienst unterstützte Format ab und kopiert diese GUID in ein IPortableDevicePropVariantCollection-Objekt .

Im folgenden Code wird die ListSupportedFormats-Methode verwendet.

// List all supported formats on the service
void ListSupportedFormats(
    IPortableDeviceService* pService)
{
    HRESULT hr              = S_OK;
    DWORD   dwNumFormats    = 0;
    CComPtr<IPortableDeviceServiceCapabilities>     pCapabilities;
    CComPtr<IPortableDevicePropVariantCollection>   pFormats;

    if (pService == NULL)
    {
        printf("! A NULL IPortableDeviceService interface pointer was received\n");
        return;
    }

    // Get an IPortableDeviceServiceCapabilities interface from the IPortableDeviceService interface to
    // access the service capabilities-specific methods.
    hr = pService->Capabilities(&pCapabilities);
    if (FAILED(hr))
    {
        printf("! Failed to get IPortableDeviceServiceCapabilities from IPortableDeviceService, hr = 0x%lx\n",hr);
    }

    // Get all formats supported by the service.
    if (SUCCEEDED(hr))
    {
        hr = pCapabilities->GetSupportedFormats(&pFormats);
        if (FAILED(hr))
        {
            printf("! Failed to get supported formats from the service, hr = 0x%lx\n",hr);
        }
    }

    // Get the number of supported formats found on the service.
    if (SUCCEEDED(hr))
    {
        hr = pFormats->GetCount(&dwNumFormats);
        if (FAILED(hr))
        {
            printf("! Failed to get number of supported formats, hr = 0x%lx\n",hr);
        }
    }

    printf("\n%d Supported Formats Found on the service\n\n", dwNumFormats);

    // Loop through each format and display it
    if (SUCCEEDED(hr))
    {
        for (DWORD dwIndex = 0; dwIndex < dwNumFormats; dwIndex++)
        {
            PROPVARIANT pv = {0};
            PropVariantInit(&pv);
            hr = pFormats->GetAt(dwIndex, &pv);

            if (SUCCEEDED(hr))
            {
                // We have a format.  It is assumed that
                // formats are returned as VT_CLSID VarTypes.
                if (pv.puuid != NULL)
                {
                    DisplayFormat(pCapabilities, *pv.puuid);
                    printf("\n");
                }
            }

            PropVariantClear(&pv);
        }
    }
}

Nachdem die ListSupportedFormats-Methode die GUID für jedes vom angegebenen Dienst unterstützte Format abgerufen hat, ruft sie die DisplayFormat-Methode auf, um den Anzeigenamen des Skripts für jedes Format anzuzeigen. Beispiel: "VCard2".

Die DisplayFormat-Methode ruft die IPortableDeviceServiceCapabilities::GetFormatAttributes-Methode zum Abrufen einer Auflistung von Attributen für die angegebene Format-GUID auf. Anschließend ruft sie die IPortableDeviceValues::GetStringValue-Methode auf und fordert an, dass der Treiber einen skriptfreundlichen Namen für das angegebene Format zurückgibt.

Im folgenden Code wird die DisplayFormat-Methode verwendet.

// Display basic information about a format
void DisplayFormat(
    IPortableDeviceServiceCapabilities* pCapabilities,
    REFGUID                             Format)
{
    CComPtr<IPortableDeviceValues> pAttributes;

    HRESULT hr = pCapabilities->GetFormatAttributes(Format, &pAttributes);

    if (SUCCEEDED(hr))
    {
        PWSTR pszFormatName = NULL;
        hr = pAttributes->GetStringValue(WPD_FORMAT_ATTRIBUTE_NAME, &pszFormatName);

        // Display the name of the format if it is available, otherwise fall back to displaying the GUID.
        if (SUCCEEDED(hr))
        {
            printf("%ws", pszFormatName);
        }
        else
        {
            printf("%ws", (PWSTR)CGuidToString(Format));
        }       

        CoTaskMemFree(pszFormatName);
        pszFormatName = NULL;
    }
}

IPortableDeviceService

IPortableDeviceServiceCapabilities

IPortableDeviceValues

WpdServicesApiSample