Richiamare metodi di servizio
L'applicazione WpdServicesApiSample include codice che illustra come un'applicazione può richiamare i metodi supportati da un determinato servizio Contatti in modo sincrono. In questo esempio vengono usate le interfacce seguenti
Interfaccia | Descrizione |
---|---|
IPortableDeviceService | Usato per recuperare l'interfaccia IPortableDeviceServiceMethods per richiamare i metodi in un determinato servizio. |
IPortableDeviceServiceMethods | Utilizzato per richiamare un metodo del servizio. |
IPortableDeviceValues | Utilizzato per contenere i parametri del metodo in uscita e i risultati del metodo in ingresso. Può essere NULL se il metodo non richiede parametri o restituisce risultati. |
Quando l'utente sceglie l'opzione "9" nella riga di comando, l'applicazione richiama il metodo InvokeMethods presente nel modulo ServiceMethods.cpp. Si noti che prima di richiamare i metodi, l'applicazione di esempio apre un servizio Contatti in un dispositivo connesso.
I metodi del servizio incapsulano la funzionalità definita e implementata da ogni servizio. Sono univoci per ogni tipo di servizio e sono rappresentati da un GUID. Ad esempio, il servizio Contatti definisce un metodo BeginSync che le applicazioni chiamano per preparare il dispositivo per la sincronizzazione degli oggetti Contact e un metodo EndSync per notificare al dispositivo che la sincronizzazione è stata completata. Le applicazioni eseguono un metodo chiamando IPortableDeviceServiceMethods::Invoke.
I metodi di servizio non devono essere confusi con i comandi WPD. I comandi WPD fanno parte dello standard WPD Device Driver Interface (DDI) e sono il meccanismo per la comunicazione tra un'applicazione WPD e il driver. I comandi sono predefiniti, raggruppati per categorie, ad esempio WPD_CATEGORY_COMMON e sono rappresentati da una struttura PROPERTYKEY . Un'applicazione invia comandi al driver di dispositivo chiamando IPortableDeviceService::SendCommand. Per altre informazioni, vedere l'argomento Comandi.
Il metodo InvokeMethods richiama il metodo IPortableDeviceService::Methods per recuperare un'interfaccia IPortableDeviceServiceMethods . Usando questa interfaccia, richiama i metodi BeginSync e EndSync chiamando il metodo IPortableDeviceServiceMethods::Invoke . Ogni volta che chiama Invoke, l'applicazione fornisce refGUID per il metodo richiamato.
Il codice seguente usa il metodo 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);
}
}
}
Argomenti correlati