Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aplikacja WpdServicesApiSample zawiera kod, który pokazuje, jak aplikacja może pobierać zdarzenia obsługiwane przez daną usługę Kontakty, wywołując metody w następujących interfejsach.
| Interfejs | Opis |
|---|---|
| IPortableDeviceService | Służy do pobierania interfejsu IPortableDeviceServiceCapabilities w celu uzyskania dostępu do obsługiwanych zdarzeń. |
| IPortableDeviceServiceCapabilities | Zapewnia dostęp do obsługiwanych zdarzeń i atrybutów zdarzeń. |
| IPortableDevicePropVariantCollection | Zawiera listę obsługiwanych zdarzeń. |
| IPortableDeviceValues | Zawiera atrybuty dla danego zdarzenia. |
Gdy użytkownik wybierze opcję "4" w wierszu polecenia, aplikacja wywołuje metodę ListSupportedEvents znalezioną w module ServiceCapabilities.cpp.
Pamiętaj, że przed pobraniem listy zdarzeń przykładowa aplikacja otwiera usługę Kontakty na połączonym urządzeniu.
W WPD zdarzenie jest opisywane przez jego nazwę, opcje i parametry. Nazwa zdarzenia to ciąg przyjazny dla skryptu, na przykład "MyCustomEvent". Opcje zdarzenia wskazują, czy dane zdarzenie jest emitowane do wszystkich klientów i czy to zdarzenie obsługuje autoodtwarzanie. Atrybuty parametru zdarzenia zawierają parametr PROPERTYKEY i VARTYPE danego parametru.
Cztery metody w module ServiceCapabilities.cpp obsługują pobieranie obsługiwanych zdarzeń dla danej usługi Kontakty: ListSupportedEvents, DisplayEvent, DisplayEventOptionsi DisplayEventParameters. Metoda ListSupportedEvents pobiera liczbę obsługiwanych zdarzeń i identyfikator GUID dla każdego zdarzenia. Metoda DisplayEvent wyświetla nazwę zdarzenia lub identyfikator GUID, a następnie wywołuje DisplayEventOptions i DisplayEventParameters w celu wyświetlenia danych związanych z zdarzeniami.
Metoda ListSupportedEvents wywołuje metodę IPortableDeviceService::Capabilities, aby pobrać interfejs IPortableDeviceServiceCapabilities. Za pomocą tego interfejsu pobiera obsługiwane zdarzenia, wywołując metodę IPortableDeviceServiceCapabilities::GetSupportedEvents. Metoda GetSupportedEvents pobiera identyfikatory GUID dla każdego zdarzenia obsługiwanego przez usługę i kopiuje te identyfikatory GUID do obiektu IPortableDevicePropVariantCollection.
Poniższy kod przedstawia pobieranie obsługiwanych zdarzeń usługi.
// 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);
}
}
}
Gdy metoda ListSupportedEvents pobiera identyfikatory GUID reprezentujące każde zdarzenie obsługiwane przez daną usługę, wywołuje metodę DisplayEvent w celu pobrania danych specyficznych dla zdarzenia. Te dane obejmują nazwę zdarzenia, jego opcje (emisja lub autoodtwarzanie), identyfikatory GUID parametrów, typy parametrów itd.
Metoda DisplayEvent wywołuje metodę IPortableDeviceServiceCapabilities::GetEventAttributes w celu uzyskania kolekcji atrybutów dla danego zdarzenia. Następnie wywołuje metodę IPortableDeviceValues::GetStringValue i żąda, aby sterownik zwrócił przyjazną nazwę dla danego zdarzenia. Następnie DisplayEvent wywołuje IPortableDeviceValues::GetIPortableDeviceValuesValue w celu pobrania opcji zdarzenia. Na koniec funkcja DisplayEvent wywołuje IPortableDeviceValues::GetIPortableDeviceKeyCollectionValue w celu pobrania listy parametrów zdarzenia. Przekazuje ona dane zwracane przez te metody do DisplayEventOptions i DisplayEventParameters funkcji pomocnika, które renderują opcje i informacje o parametrach dla danego zdarzenia.
Poniższy kod używa metody 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;
}
}
Funkcja pomocnika DisplayEventOptions odbiera obiekt IPortableDeviceValues zawierający dane opcji zdarzenia. Następnie wywołuje metodę IPortableDeviceValues::GetBoolValue, aby pobrać dane opcji. Przy użyciu tych danych renderuje ciąg wskazujący, czy są obsługiwane opcje emisji i autoodtwarzania.
// 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");
}
Tematy pokrewne