サポートされているサービス形式の取得

WpdServicesApiSample アプリケーションには、アプリケーションが次の表のインターフェイスのメソッドを呼び出すことによって、特定の Contacts サービスでサポートされている形式を取得する方法を示すコードが含まれています。

インターフェイス 説明
IPortableDeviceService サポートされているイベントにアクセスするために IPortableDeviceServiceCapabilities インターフェイスを取得するために使用されます。
IPortableDeviceServiceCapabilities サポートされているイベントとイベント属性へのアクセスを提供します。
IPortableDevicePropVariantCollection サポートされている形式の一覧が含まれます。
IPortableDeviceValues 指定された形式の属性を格納します。

 

ユーザーがコマンド ラインでオプション "3" を選択すると、アプリケーションは ServiceCapabilities.cpp モジュールにある ListSupportedFormats メソッドを呼び出します。

イベントの一覧を取得する前に、サンプル アプリケーションによって接続されているデバイスで連絡先サービスが開かれることに注意してください。

WPD では、形式は、指定された形式の名前と (必要に応じて) MIME の種類を指定する属性によって記述されます。 これらの属性は、PortableDevice.h ヘッダー ファイルで定義されています。 サポートされている属性の説明については、 属性 に関するトピックを参照してください。

サンプル アプリケーションの場合、WpdServiceSampleDriver がインストールされている唯一のデバイスである場合、ドライバーは Contact サービスでサポートされている 2 つの形式 ("AbstractContactFormat" と "VCard2Format" ) を返します。 これらの形式は、PortableDevice.h の WPD_OBJECT_FORMAT_ABSTRACT_CONTACT および WPD_OBJECT_FORMAT_VCARD2 属性に対応します。

ServiceCapabilities.cpp モジュールの 2 つのメソッドは、連絡先サービスでサポートされている形式の取得をサポートしています。 ListSupportedFormatsDisplayFormat。 前者は、サポートされている各形式の GUID 識別子を取得します。 後者は、この GUID をわかりやすい文字列に変換します。

ListSupportedFormats メソッドは、IPortableDeviceService::Capabilities メソッドを呼び出して IPortableDeviceServiceCapabilities インターフェイスを取得します。 このインターフェイスを使用して、 IPortableDeviceServiceCapabilities::GetSupportedFormats メソッドを呼び出して、サポートされている形式を取得します。 GetSupportedFormats メソッドは、サービスでサポートされている各形式の GUID を取得し、その GUID を IPortableDevicePropVariantCollection オブジェクトにコピーします。

次のコードでは、 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);
        }
    }
}

ListSupportedFormats メソッドは、指定されたサービスでサポートされている各形式の GUID を取得した後、DisplayFormat メソッドを呼び出して、各形式のスクリプトフレンドリ名を表示します。たとえば、"VCard2" などです。

DisplayFormat メソッドは、指定された形式 GUID の属性のコレクションを取得する IPortableDeviceServiceCapabilities::GetFormatAttributes メソッドを呼び出します。 次に 、IPortableDeviceValues::GetStringValue メソッドを呼び出し、ドライバーが指定された形式のスクリプトフレンドリ名を返すように要求します。

次のコードでは、 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