Поделиться через


Вызов методов службы

Приложение 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);
        } 
    }
}

IPortableDeviceService

IPortableDeviceServiceMethods

WpdServicesApiSample