Mengambil Format Layanan yang Didukung

Aplikasi WpdServicesApiSample menyertakan kode yang menunjukkan bagaimana aplikasi dapat mengambil format yang didukung oleh layanan Kontak tertentu dengan memanggil metode antarmuka dalam tabel berikut.

Antarmuka Deskripsi
IPortableDeviceService Digunakan untuk mengambil antarmuka IPortableDeviceServiceCapabilities untuk mengakses peristiwa yang didukung.
IPortableDeviceServiceCapabilities Menyediakan akses ke peristiwa dan atribut peristiwa yang didukung.
IPortableDevicePropVariantCollection Berisi daftar format yang didukung.
IPortableDeviceValues Berisi atribut untuk format tertentu.

 

Ketika pengguna memilih opsi "3" di baris perintah, aplikasi memanggil metode ListSupportedFormats yang ditemukan dalam modul ServiceCapabilities.cpp.

Perhatikan bahwa sebelum mengambil daftar peristiwa, aplikasi sampel membuka layanan Kontak pada perangkat yang terhubung.

Dalam WPD, format dijelaskan oleh atribut yang menentukan nama dan (opsional) jenis MIME dari format tertentu. Atribut ini didefinisikan dalam file headerPortableDevice.h. Untuk deskripsi atribut yang didukung, lihat topik Atribut .

Dalam kasus aplikasi sampel, jika WpdServiceSampleDriver adalah satu-satunya perangkat yang diinstal, driver mengembalikan dua format yang didukung untuk layanan Kontaknya: "AbstractContactFormat" dan "VCard2Format". Format ini sesuai dengan WPD_OBJECT_FORMAT_ABSTRACT_CONTACT dan atribut WPD_OBJECT_FORMAT_VCARD2 yang ditemukan di PortableDevice.h.

Dua metode dalam modul ServiceCapabilities.cpp mendukung pengambilan format yang didukung untuk layanan Kontak: ListSupportedFormats dan DisplayFormat. Yang pertama mengambil pengidentifikasi GUID untuk setiap format yang didukung. Yang terakhir mengonversi GUID ini menjadi string yang mudah digunakan.

Metode ListSupportedFormats memanggil metode IPortableDeviceService::Capabilities untuk mengambil antarmuka IPortableDeviceServiceCapabilities . Menggunakan antarmuka ini, ia mengambil format yang didukung dengan memanggil metode IPortableDeviceServiceCapabilities::GetSupportedFormats . Metode GetSupportedFormats mengambil GUID untuk setiap format yang didukung oleh layanan dan menyalin GUID tersebut ke dalam objek IPortableDevicePropVariantCollection .

Kode berikut menggunakan metode 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);
        }
    }
}

Setelah metode ListSupportedFormats mengambil GUID untuk setiap format yang didukung oleh layanan tertentu, metode DisplayFormat akan memanggil metode DisplayFormat untuk menampilkan nama ramah skrip untuk setiap format; misalnya, "VCard2".

Metode DisplayFormat memanggil metode IPortableDeviceServiceCapabilities::GetFormatAttributes mengambil kumpulan atribut untuk format GUID yang diberikan. Kemudian memanggil metode IPortableDeviceValues::GetStringValue dan meminta agar driver mengembalikan nama yang ramah skrip untuk format yang diberikan.

Kode berikut menggunakan metode 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