Memanggil Metode Layanan

Aplikasi WpdServicesApiSample menyertakan kode yang menunjukkan bagaimana aplikasi dapat memanggil metode yang didukung oleh layanan Kontak tertentu secara sinkron.. Sampel ini menggunakan antarmuka berikut

Antarmuka Deskripsi
IPortableDeviceService Digunakan untuk mengambil antarmuka IPortableDeviceServiceMethods untuk memanggil metode pada layanan tertentu.
IPortableDeviceServiceMethods Digunakan untuk memanggil metode layanan.
IPortableDeviceValues Digunakan untuk menahan parameter metode keluar, dan hasil metode masuk. Ini bisa NULL jika metode tidak memerlukan parameter apa pun atau mengembalikan hasil apa pun.

 

Ketika pengguna memilih opsi "9" di baris perintah, aplikasi memanggil metode InvokeMethods yang ditemukan dalam modul ServiceMethods.cpp. Perhatikan bahwa sebelum memanggil metode, aplikasi sampel membuka layanan Kontak pada perangkat yang terhubung.

Metode layanan merangkum fungsionalitas yang ditentukan dan diterapkan setiap layanan. Mereka unik untuk setiap jenis layanan dan diwakili oleh GUID. Misalnya, layanan Kontak menentukan metode BeginSync yang dipanggil aplikasi untuk menyiapkan perangkat guna menyinkronkan objek Kontak, dan metode EndSync untuk memberi tahu perangkat bahwa sinkronisasi telah selesai. Aplikasi menjalankan metode dengan memanggil IPortableDeviceServiceMethods::Invoke.

Metode layanan tidak boleh dikacaukan dengan perintah WPD. Perintah WPD adalah bagian dari Antarmuka Driver Perangkat (DDI) WPD standar, dan merupakan mekanisme untuk komunikasi antara aplikasi WPD dan driver. Perintah telah ditentukan sebelumnya, dikelompokkan menurut kategori, misalnya, WPD_CATEGORY_COMMON, dan diwakili oleh struktur PROPERTYKEY . Aplikasi mengirim perintah ke driver perangkat dengan memanggil IPortableDeviceService::SendCommand. Untuk informasi selengkapnya, lihat topik Perintah.

Metode InvokeMethods memanggil metode IPortableDeviceService::Methods untuk mengambil antarmuka IPortableDeviceServiceMethods . Dengan menggunakan antarmuka ini, ia memanggil metode BeginSync dan EndSync dengan memanggil metode IPortableDeviceServiceMethods::Invoke . Setiap kali memanggil Invoke, aplikasi menyediakan REFGUID untuk metode yang dipanggil.

Kode berikut menggunakan metode 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