Вызов методов службы
Приложение WpdServicesApiSample содержит код, демонстрирующий, как приложение может синхронно вызывать методы, поддерживаемые данной службой контактов. В этом примере используются следующие интерфейсы:
Интерфейс | Описание |
---|---|
IPortableDeviceService | Используется для получения интерфейса IPortableDeviceServiceMethods для вызова методов в данной службе. |
IPortableDeviceServiceMethods | Используется для вызова метода службы. |
IPortableDeviceValues | Используется для хранения параметров исходящего метода и входящих результатов метода. Это значение может иметь значение NULL , если метод не требует никаких параметров или не возвращает никаких результатов. |
Когда пользователь выбирает параметр "9" в командной строке, приложение вызывает метод InvokeMethods , который находится в модуле ServiceMethods.cpp. Обратите внимание, что перед вызовом методов пример приложения открывает службу контактов на подключенном устройстве.
Методы службы инкапсулируют функциональные возможности, которые каждая служба определяет и реализует. Они уникальны для каждого типа службы и представлены GUID. Например, служба "Контакты" определяет метод BeginSync , который вызывается приложениями для подготовки устройства к синхронизации объектов Contact, и метод EndSync для уведомления устройства о завершении синхронизации. Приложения выполняют метод, вызывая метод IPortableDeviceServiceMethods::Invoke.
Методы службы не следует путать с командами WPD. Команды WPD являются частью стандартного интерфейса драйвера устройства WPD (DDI) и являются механизмом взаимодействия между приложением WPD и драйвером. Команды являются предопределенными, сгруппированы по категориям, например WPD_CATEGORY_COMMON, и представлены структурой PROPERTYKEY . Приложение отправляет команды драйверу устройства, вызывая IPortableDeviceService::SendCommand. Дополнительные сведения см. в разделе Команды.
Метод InvokeMethods вызывает метод IPortableDeviceService::Methods для получения интерфейса IPortableDeviceServiceMethods . Используя этот интерфейс, он вызывает методы BeginSync и EndSync , вызывая метод IPortableDeviceServiceMethods::Invoke . При каждом вызове Invoke приложение предоставляет REFGUID для вызываемого метода.
В следующем коде используется метод InvokeMethods .
// Invoke methods on the Contacts Service.
// BeginSync and EndSync are methods defined by the FullEnumerationSync Device Service.
void InvokeMethods(IPortableDeviceService* pService)
{
HRESULT hr = S_OK;
CComPtr<IPortableDeviceServiceMethods> pMethods;
if (pService == NULL)
{
printf("! A NULL IPortableDeviceService interface pointer was received\n");
return;
}
// Get an IPortableDeviceServiceMethods interface from the IPortableDeviceService interface to
// invoke methods.
hr = pService->Methods(&pMethods);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceServiceMethods from IPortableDeviceService, hr = 0x%lx\n",hr);
}
// Invoke() the BeginSync method
if (SUCCEEDED(hr))
{
// This method does not take any parameters or results, so we pass in NULL
hr = pMethods->Invoke(METHOD_FullEnumSyncSvc_BeginSync, NULL, NULL);
if (SUCCEEDED(hr))
{
printf("%ws called, hr = 0x%lx\n",NAME_FullEnumSyncSvc_BeginSync, hr);
}
else
{
printf("! Failed to invoke %ws, hr = 0x%lx\n",NAME_FullEnumSyncSvc_BeginSync, hr);
}
}
// Invoke the EndSync method asynchronously
if (SUCCEEDED(hr))
{
// This method does not take any parameters or results, so we pass in NULL
hr = pMethods->Invoke(METHOD_FullEnumSyncSvc_EndSync, NULL, NULL);
if (SUCCEEDED(hr))
{
printf("%ws called, hr = 0x%lx\n",NAME_FullEnumSyncSvc_EndSync, hr);
}
else
{
printf("! Failed to invoke %ws, hr = 0x%lx\n",NAME_FullEnumSyncSvc_EndSync, hr);
}
}
}
Связанные темы