Получение поддерживаемых событий службы
Приложение 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 для каждого события, поддерживаемого службой, и копирует их в объект 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::GetIPortableDeviceValuesValuesValue для получения параметров события. Наконец, 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");
}
Связанные темы