Поделиться через


Получение поддерживаемых событий службы

Приложение WpdServicesApiSample содержит код, демонстрирующий, как приложение может получать события, поддерживаемые данной службой контактов, вызывая методы в следующих интерфейсах.

Интерфейс Описание
IPortableDeviceService Используется для получения интерфейса IPortableDeviceServiceCapabilities для доступа к поддерживаемым событиям.
IPortableDeviceServiceCapabilities Предоставляет доступ к поддерживаемым событиям и атрибутам событий.
IPortableDevicePropVariantCollection Содержит список поддерживаемых событий.
IPortableDeviceValues Содержит атрибуты для данного события.

 

Когда пользователь выбирает параметр "4" в командной строке, приложение вызывает метод ListSupportedEvents, найденный в модуле ServiceCapabilities.cpp.

Обратите внимание, что до получения списка событий пример приложения открывает службу контактов на подключенном устройстве.

В WPD событие описывается его именем, опциями и параметрами. Имя события — это строка, удобная для скрипта, например MyCustomEvent. Параметры события указывают, передается ли данное событие всем клиентам и поддерживает ли это событие автозапуск. Атрибуты параметра события включают свойство PROPERTYKEY и VARTYPE данного параметра.

Четыре метода в модуле ServiceCapabilities.cpp поддерживают получение поддерживаемых событий для данной службы контактов: ListSupportedEvents, DisplayEvent, DisplayEventOptionsи DisplayEventParameters. Метод ListSupportedEvents извлекает количество поддерживаемых событий и идентификатор GUID для каждого события. Метод DisplayEvent отображает имя события или GUID, а затем вызывает DisplayEventOptions и DisplayEventParameters для отображения данных, связанных с событиями.

Метод ListSupportedEvents вызывает метод IPortableDeviceService::Capabilities для получения интерфейса IPortableDeviceServiceCapabilities. Используя этот интерфейс, он извлекает поддерживаемые события путем вызова метода IPortableDeviceServiceCapabilities::GetSupportedEvents. Метод getSupportedEvents получает идентификаторы GUID для каждого события, поддерживаемого службой, и копирует эти идентификаторы GUID в объект IPortableDevicePropVariantCollection.

Следующий код показывает получение поддерживаемых событий сервисов.

// List all supported events on the service
void ListSupportedEvents(
    IPortableDeviceService* pService)
{
    HRESULT hr          = S_OK;
    DWORD   dwNumEvents = 0;
    CComPtr<IPortableDeviceServiceCapabilities>     pCapabilities;
    CComPtr<IPortableDevicePropVariantCollection>   pEvents;

    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 events supported by the service.
    if (SUCCEEDED(hr))
    {
        hr = pCapabilities->GetSupportedEvents(&pEvents);
        if (FAILED(hr))
        {
            printf("! Failed to get supported events from the service, hr = 0x%lx\n",hr);
        }
    }

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

    printf("\n%d Supported Events Found on the service\n\n", dwNumEvents);

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

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

            PropVariantClear(&pv);
        }
    }
}

После того как метод listSupportedEvents извлекает идентификаторы GUID, представляющие каждое событие, поддерживаемое данной службой, вызывает метод DisplayEvent для получения данных, относящихся к событиям. Эти данные включают имя события, его опции (широковещание или автоматическое воспроизведение), идентификаторы GUID параметров, типы параметров и так далее.

Метод DisplayEvent вызывает метод IPortableDeviceServiceCapabilities::GetEventAttributes для получения коллекции атрибутов для данного события. Затем он вызывает метод IPortableDeviceValues::GetStringValue и запрашивает, что драйвер возвращает понятное имя для данного события. Затем DisplayEvent вызывает IPortableDeviceValues::GetIPortableDeviceValuesValue для получения параметров события. Наконец, DisplayEvent вызывает IPortableDeviceValues::GetIPortableDeviceKeyCollectionValue, чтобы получить список параметров события. Он передает данные, возвращаемые этими методами, во вспомогательные функции DisplayEventOptions и DisplayEventParameters, которые отображают опции и сведения о параметрах для данного события.

В следующем коде используется метод DisplayEvent.

// Display basic information about an event
void DisplayEvent(
    IPortableDeviceServiceCapabilities* pCapabilities,
    REFGUID                             Event)
{
    CComPtr<IPortableDeviceValues> pAttributes;

    // Get the event attributes which describe the event
    HRESULT hr = pCapabilities->GetEventAttributes(Event, &pAttributes);
    if (FAILED(hr))
    {
        printf("! Failed to get the event attributes, hr = 0x%lx\n",hr);
    }

    if (SUCCEEDED(hr))
    {
        PWSTR pszFormatName = NULL;
        CComPtr<IPortableDeviceValues>          pOptions;
        CComPtr<IPortableDeviceKeyCollection>   pParameters;

        // Display the name of the event if it is available. Otherwise, fall back to displaying the GUID.
        hr = pAttributes->GetStringValue(WPD_EVENT_ATTRIBUTE_NAME, &pszFormatName);
        if (SUCCEEDED(hr))
        {
            printf("%ws\n", pszFormatName);
        }
        else
        {
            printf("%ws\n", (PWSTR)CGuidToString(Event));
        }       

        // Display the event options
        hr = pAttributes->GetIPortableDeviceValuesValue(WPD_EVENT_ATTRIBUTE_OPTIONS, &pOptions);
        if (SUCCEEDED(hr))
        {
            DisplayEventOptions(pOptions);
        }
        else
        {
            printf("! Failed to get the event options, hr = 0x%lx\n", hr);
        }       

        // Display the event parameters
        hr = pAttributes->GetIPortableDeviceKeyCollectionValue(WPD_EVENT_ATTRIBUTE_PARAMETERS, &pParameters);
        if (SUCCEEDED(hr))
        {
            DisplayEventParameters(pCapabilities, Event, pParameters);
        }
        else
        {
            printf("! Failed to get the event parameters, hr = 0x%lx\n", hr);
        }       
        
        CoTaskMemFree(pszFormatName);
        pszFormatName = NULL;
    }
}

Функция DisplayEventOptions получает объект IPortableDeviceValues, содержащий данные опций события. Затем он вызывает метод IPortableDeviceValues::GetBoolValue для получения данных параметров. С помощью этих данных она отображает строку, указывающую, поддерживаются ли параметры трансляции и автозапуска.

// Display the basic event options.
void DisplayEventOptions(
    IPortableDeviceValues* pOptions)
{
    printf("\tEvent Options:\n");
    // Read the WPD_EVENT_OPTION_IS_BROADCAST_EVENT value to see if the event is
    // a broadcast event. If the read fails, assume FALSE
    BOOL  bIsBroadcastEvent = FALSE;
    pOptions->GetBoolValue(WPD_EVENT_OPTION_IS_BROADCAST_EVENT, &bIsBroadcastEvent);
    printf("\tWPD_EVENT_OPTION_IS_BROADCAST_EVENT = %ws\n",bIsBroadcastEvent ? L"TRUE" : L"FALSE");
}

IPortableDeviceKeyCollection

IPortableDeviceService

IPortableDeviceServiceCapabilities

IPortableDeviceValues

WpdServicesApiSample