서비스 메서드 호출
WpdServicesApiSample 애플리케이션에는 애플리케이션이 지정된 Contacts 서비스에서 지원하는 메서드를 동기적으로 호출하는 방법을 보여 주는 코드가 포함되어 있습니다. 이 샘플에서는 다음 인터페이스를 사용합니다.
인터페이스 | Description |
---|---|
IPortableDeviceService | 지정된 서비스에서 메서드를 호출하기 위해 IPortableDeviceServiceMethods 인터페이스를 검색하는 데 사용됩니다. |
IPortableDeviceServiceMethods | 서비스 메서드를 호출하는 데 사용됩니다. |
IPortableDeviceValues | 나가는 메서드 매개 변수 및 들어오는 메서드 결과를 보유하는 데 사용됩니다. 메서드에 매개 변수가 필요하지 않거나 결과를 반환하지 않는 경우 NULL 일 수 있습니다. |
사용자가 명령줄에서 옵션 "9"를 선택하면 애플리케이션은 ServiceMethods.cpp 모듈에 있는 InvokeMethods 메서드를 호출합니다. 메서드를 호출하기 전에 샘플 애플리케이션은 연결된 디바이스에서 Contacts 서비스를 엽니다.
서비스 메서드는 각 서비스가 정의하고 구현하는 기능을 캡슐화합니다. 각 서비스 유형에 고유하며 GUID로 표시됩니다. 예를 들어 Contacts 서비스는 애플리케이션이 Contact 개체 동기화를 위해 디바이스를 준비하기 위해 호출하는 BeginSync 메서드와 동기화가 완료되었음을 디바이스에 알리는 EndSync 메서드를 정의합니다. 애플리케이션은 IPortableDeviceServiceMethods::Invoke를 호출하여 메서드를 실행합니다.
서비스 메서드는 WPD 명령과 혼동해서는 안 됩니다. WPD 명령은 표준 WPD DDI(디바이스 드라이버 인터페이스)의 일부이며 WPD 애플리케이션과 드라이버 간의 통신 메커니즘입니다. 명령은 미리 정의되고 범주(예: WPD_CATEGORY_COMMON)로 그룹화되며 PROPERTYKEY 구조체로 표시됩니다. 애플리케이션은 IPortableDeviceService::SendCommand를 호출하여 디바이스 드라이버에 명령을 보냅니다. 자세한 내용은 명령 항목을 참조하세요.
InvokeMethods 메서드는 IPortableDeviceService::Methods 메서드를 호출하여 IPortableDeviceServiceMethods 인터페이스를 검색합니다. 이 인터페이스를 사용하여 IPortableDeviceServiceMethods::Invoke 메서드를 호출하여 BeginSync 및 EndSync 메서드를 호출합니다. 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);
}
}
}
관련 항목