다음을 통해 공유


지원되는 서비스 형식 검색

WpdServicesApiSample 애플리케이션에는 다음 표에 있는 인터페이스의 메서드를 호출하여 애플리케이션이 지정된 Contacts 서비스에서 지원하는 형식을 검색하는 방법을 보여 주는 코드가 포함되어 있습니다.

인터페이스 Description
IPortableDeviceService 지원되는 이벤트에 액세스하기 위해 IPortableDeviceServiceCapabilities 인터페이스를 검색하는 데 사용됩니다.
IPortableDeviceServiceCapabilities 지원되는 이벤트 및 이벤트 특성에 대한 액세스를 제공합니다.
IPortableDevicePropVariantCollection 지원되는 형식 목록을 포함합니다.
IPortableDeviceValues 지정된 형식에 대한 특성을 포함합니다.

 

사용자가 명령줄에서 옵션 "3"을 선택하면 애플리케이션은 ServiceCapabilities.cpp 모듈에 있는 ListSupportedFormats 메서드를 호출합니다.

이벤트 목록을 검색하기 전에 샘플 애플리케이션은 연결된 디바이스에서 연락처 서비스를 엽니다.

WPD에서 형식은 지정된 형식의 이름 및 MIME 형식(선택 사항)을 지정하는 특성으로 설명됩니다. 이러한 특성은PortableDevice.h 헤더 파일에 정의됩니다. 지원되는 특성에 대한 설명은 특성 항목을 참조하세요.

샘플 애플리케이션의 경우 WpdServiceSampleDriver가 유일하게 설치된 디바이스인 경우 드라이버는 연락처 서비스에 대해 지원되는 두 가지 형식인 "AbstractContactFormat" 및 "VCard2Format"을 반환합니다. 이러한 형식은 PortableDevice.h에 있는 WPD_OBJECT_FORMAT_ABSTRACT_CONTACT 및 WPD_OBJECT_FORMAT_VCARD2 특성에 해당합니다.

ServiceCapabilities.cpp 모듈의 두 메서드는 Contacts 서비스에 대해 지원되는 형식의 검색을 지원합니다. 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