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 pobrać formaty obsługiwane przez daną usługę Kontakty, wywołując metody interfejsów w poniższej tabeli.
| 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 formatów. |
| IPortableDeviceValues | Zawiera atrybuty dla danego formatu. |
Gdy użytkownik wybierze opcję "3" w wierszu polecenia, aplikacja wywołuje metodę ListSupportedFormats 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 format jest opisywany przez atrybuty, które określają nazwę i (opcjonalnie) typ MIME danego formatu. Te atrybuty są definiowane w pliku nagłówkowymPortableDevice.h. Opis obsługiwanych atrybutów można znaleźć w sekcji Atrybuty.
W przypadku przykładowej aplikacji, jeśli wpdServiceSampleDriver jest jedynym zainstalowanym urządzeniem, sterownik zwraca dwa obsługiwane formaty dla usługi Kontakt: "AbstractContactFormat" i "VCard2Format". Te formaty odpowiadają WPD_OBJECT_FORMAT_ABSTRACT_CONTACT i atrybutom WPD_OBJECT_FORMAT_VCARD2 znalezionych w pliku PortableDevice.h.
Dwie metody w module ServiceCapabilities.cpp obsługują pobieranie obsługiwanych formatów dla usługi Kontakty: ListSupportedFormats i DisplayFormat. Pierwszy pobiera identyfikator GUID dla każdego obsługiwanego formatu. Ten ostatni konwertuje ten identyfikator GUID na przyjazny dla użytkownika ciąg.
Metoda ListSupportedFormats wywołuje metodę IPortableDeviceService::Capabilities, aby pobrać interfejs IPortableDeviceServiceCapabilities. Za pomocą tego interfejsu pobiera obsługiwane formaty, wywołując metodę IPortableDeviceServiceCapabilities::GetSupportedFormats. Metoda GetSupportedFormats pobiera identyfikator GUID dla każdego formatu obsługiwanego przez usługę i kopiuje ten identyfikator GUID do obiektu IPortableDevicePropVariantCollection.
Poniższy kod używa metody 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);
}
}
}
Po tym jak metoda ListSupportedFormats pobierze identyfikator GUID dla każdego formatu obsługiwanego przez daną usługę, wywołuje metodę DisplayFormat, aby wyświetlić przyjazną nazwę dla użytkownika dla każdego formatu; na przykład "VCard2".
Metoda DisplayFormat wywołuje metodę IPortableDeviceServiceCapabilities::GetFormatAttributes, która pobiera kolekcję atrybutów dla danego identyfikatora GUID formatu. Następnie wywołuje metodę IPortableDeviceValues::GetStringValue i żąda, aby sterownik zwrócił przyjazną dla skryptu nazwę danego formatu.
Poniższy kod używa metody 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;
}
}
Tematy pokrewne