Udostępnij przez


Pobieranie obsługiwanych formatów usługi

Aplikacja WpdServicesApiSample zawiera kod, który pokazuje, jak aplikacja może pobrać formaty obsługiwane przez daną usługę Kontakty, wywołując metody interfejsów w poniższej tabeli.

Interfejs Opis
IPortableDeviceService Służy do pobierania interfejsu IPortableDeviceServiceCapabilities w celu uzyskania dostępu do obsługiwanych zdarzeń.
IPortableDeviceServiceCapabilities Zapewnia dostęp do obsługiwanych zdarzeń i atrybutów zdarzeń.
IPortableDevicePropVariantCollection Zawiera listę obsługiwanych formatów.
IPortableDeviceValues Zawiera atrybuty dla danego formatu.

 

Gdy użytkownik wybierze opcję "3" w wierszu polecenia, aplikacja wywołuje metodę ListSupportedFormats znalezioną w module ServiceCapabilities.cpp.

Pamiętaj, że przed pobraniem listy zdarzeń przykładowa aplikacja otwiera usługę Kontakty na połączonym urządzeniu.

W wpD format jest opisywany przez atrybuty, które określają nazwę i (opcjonalnie) typ MIME danego formatu. Te atrybuty są definiowane w pliku nagłówkowymPortableDevice.h. Opis obsługiwanych atrybutów można znaleźć w sekcji Atrybuty.

W przypadku przykładowej aplikacji, jeśli wpdServiceSampleDriver jest jedynym zainstalowanym urządzeniem, sterownik zwraca dwa obsługiwane formaty dla usługi Kontakt: "AbstractContactFormat" i "VCard2Format". Te formaty odpowiadają WPD_OBJECT_FORMAT_ABSTRACT_CONTACT i atrybutom WPD_OBJECT_FORMAT_VCARD2 znalezionych w pliku PortableDevice.h.

Dwie metody w module ServiceCapabilities.cpp obsługują pobieranie obsługiwanych formatów dla usługi Kontakty: ListSupportedFormats i DisplayFormat. Pierwszy pobiera identyfikator GUID dla każdego obsługiwanego formatu. Ten ostatni konwertuje ten identyfikator GUID na przyjazny dla użytkownika ciąg.

Metoda ListSupportedFormats wywołuje metodę IPortableDeviceService::Capabilities, aby pobrać interfejs IPortableDeviceServiceCapabilities. Za pomocą tego interfejsu pobiera obsługiwane formaty, wywołując metodę IPortableDeviceServiceCapabilities::GetSupportedFormats. Metoda GetSupportedFormats pobiera identyfikator GUID dla każdego formatu obsługiwanego przez usługę i kopiuje ten identyfikator GUID do obiektu IPortableDevicePropVariantCollection.

Poniższy kod używa metody ListSupportedFormats.

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

Po tym jak metoda ListSupportedFormats pobierze identyfikator GUID dla każdego formatu obsługiwanego przez daną usługę, wywołuje metodę DisplayFormat, aby wyświetlić przyjazną nazwę dla użytkownika dla każdego formatu; na przykład "VCard2".

Metoda DisplayFormat wywołuje metodę IPortableDeviceServiceCapabilities::GetFormatAttributes, która pobiera kolekcję atrybutów dla danego identyfikatora GUID formatu. Następnie wywołuje metodę IPortableDeviceValues::GetStringValue i żąda, aby sterownik zwrócił przyjazną dla skryptu nazwę danego formatu.

Poniższy kod używa metody DisplayFormat.

// 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