Получение поддерживаемых форматов служб
Приложение WpdServicesApiSample содержит код, демонстрирующий, как приложение может получить форматы, поддерживаемые данной службой контактов, путем вызова методов интерфейсов в следующей таблице.
Интерфейс | Описание |
---|---|
IPortableDeviceService | Используется для получения интерфейса IPortableDeviceServiceCapabilities для доступа к поддерживаемым событиям. |
IPortableDeviceServiceCapabilities | Предоставляет доступ к поддерживаемым событиям и атрибутам событий. |
IPortableDevicePropVariantCollection | Содержит список поддерживаемых форматов. |
IPortableDeviceValues | Содержит атрибуты для заданного формата. |
Когда пользователь выбирает параметр "3" в командной строке, приложение вызывает метод ListSupportedFormats , который находится в модуле ServiceCapabilities.cpp.
Обратите внимание, что перед получением списка событий пример приложения открывает службу контактов на подключенном устройстве.
В WPD формат описывается атрибутами, указывающими имя и (необязательно) тип MIME данного формата. Эти атрибуты определены в файле заголовкаPortableDevice.h. Описание поддерживаемых атрибутов см. в разделе Атрибуты .
Если в примере приложения единственным установленным устройством является WpdServiceSampleDriver, драйвер возвращает два поддерживаемых формата для своей службы контактов: AbstractContactFormat и VCard2Format. Эти форматы соответствуют атрибутам WPD_OBJECT_FORMAT_ABSTRACT_CONTACT и WPD_OBJECT_FORMAT_VCARD2 , найденным в PortableDevice.h.
Два метода в модуле ServiceCapabilities.cpp поддерживают получение поддерживаемых форматов для службы контактов: ListSupportedFormats и DisplayFormat. Первый извлекает идентификатор GUID для каждого поддерживаемого формата. Последний преобразует этот GUID в удобную для пользователя строку.
Метод ListSupportedFormats вызывает метод IPortableDeviceService::Capabilities для получения интерфейса IPortableDeviceServiceCapabilities . Используя этот интерфейс, он извлекает поддерживаемые форматы, вызывая метод IPortableDeviceServiceCapabilities::GetSupportedFormats . Метод GetSupportedFormats извлекает 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 вызывает метод IPortableDeviceServiceCapabilities::GetFormatAttributes , получающий коллекцию атрибутов для заданного GUID формата. Затем он вызывает метод 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;
}
}
Связанные темы