Melakukan Panggilan Asinkron dengan C++

Aplikasi WMI yang ditulis dalam C++ dapat melakukan panggilan asinkron dengan menggunakan banyak metode antarmuka IWbemServices COM. Namun, prosedur yang direkomendasikan untuk memanggil metode WMI atau metode penyedia adalah dengan menggunakan panggilan semisinkron karena panggilan semisinkron lebih aman daripada panggilan asinkron. Untuk informasi selengkapnya, lihat Melakukan Panggilan Semisinkron dengan C++ dan Mengatur Keamanan pada Panggilan Asinkron.

Prosedur berikut menjelaskan cara melakukan panggilan asinkron dengan menggunakan sink dalam proses Anda.

Untuk melakukan panggilan asinkron menggunakan C++

  1. Terapkan antarmuka IWbemObjectSink .

    Semua aplikasi yang melakukan panggilan asinkron harus mengimplementasikan IWbemObjectSink. Konsumen acara sementara juga menerapkan IWbemObjectSink untuk menerima pemberitahuan peristiwa.

  2. Masuk ke namespace WMI target.

    Aplikasi selalu harus memanggil fungsi COM CoInitializeSecurity selama fase inisialisasi. Jika mereka tidak melakukannya sebelum melakukan panggilan asinkron, WMI merilis sink aplikasi tanpa menyelesaikan panggilan asinkron. Untuk informasi selengkapnya, lihat Menginisialisasi COM untuk Aplikasi WMI.

  3. Atur keamanan untuk sink Anda.

    Panggilan asinkron membuat berbagai masalah keamanan yang mungkin harus Anda tangani, misalnya, memungkinkan akses WMI ke aplikasi Anda. Untuk informasi selengkapnya, lihat Mengatur Keamanan pada Panggilan Asinkron.

  4. Lakukan panggilan asinkron.

    Metode ini segera kembali dengan kode keberhasilan WBEM_S_NO_ERROR . Aplikasi dapat melanjutkan tugas lain sambil menunggu operasi selesai. WMI melaporkan kembali ke aplikasi dengan memanggil metode dalam implementasi IWbemObjectSink aplikasi Anda.

  5. Jika perlu, periksa implementasi Anda secara berkala untuk pembaruan.

    Aplikasi dapat menerima pemberitahuan status perantara dengan mengatur parameter lFlags dalam panggilan asinkron ke WBEM_FLAG_SEND_STATUS. WMI melaporkan status panggilan Anda dengan mengatur parameter lFlagsIWbemObjectSink ke WBEM_STATUS_PROGRESS.

  6. Jika perlu, Anda dapat membatalkan panggilan sebelum WMI selesai diproses dengan memanggil metode IWbemServices::CancelCallAsync .

    Metode CancelAsyncCall membatalkan pemrosesan asinkron dengan segera merilis pointer ke antarmuka IWbemObjectSink dan menjamin bahwa pointer dirilis sebelum CancelAsyncCall kembali.

    Jika Anda menggunakan objek pembungkus yang mengimplementasikan antarmuka IUnsecured untuk menghosting IWbemObjectSink, Anda mungkin menemukan beberapa komplikasi tambahan. Karena aplikasi harus meneruskan pointer yang sama ke CancelAsyncCall yang diteruskan dalam panggilan asinkron asli, aplikasi harus berpegang pada objek pembungkus sampai menjadi jelas bahwa pembatalan tidak diperlukan. Untuk informasi selengkapnya, lihat Mengatur Keamanan pada Panggilan Asinkron.

  7. Setelah selesai, bersihkan pointer dan matikan aplikasi.

    WMI menyediakan panggilan status akhir melalui metode SetStatus .

    Catatan

    Setelah mengirim pembaruan status akhir, WMI merilis sink objek dengan memanggil metode Rilis untuk kelas yang mengimplementasikan antarmuka IWbemObjectSink . Dalam contoh sebelumnya, ini adalah metode QuerySink::Release . Jika Anda ingin memiliki kontrol atas masa pakai objek sink, Anda dapat mengimplementasikan sink dengan jumlah referensi awal satu (1).

     

    Jika aplikasi klien melewati antarmuka sink yang sama dalam dua panggilan asinkron yang tumpang tindih yang berbeda, WMI tidak menjamin urutan panggilan balik. Aplikasi klien yang melakukan panggilan asinkron yang tumpang tindih harus melewati objek sink yang berbeda atau membuat serial panggilan.

Contoh berikut memerlukan referensi dan pernyataan #include berikut.

#include <iostream>
using namespace std;
#pragma comment(lib, "wbemuuid.lib")
#include <wbemidl.h>

Contoh berikut menjelaskan cara membuat kueri asinkron menggunakan metode ExecQueryAsync , tetapi tidak membuat pengaturan keamanan atau merilis objek IWbemObjectSink . Untuk informasi selengkapnya, lihat Mengatur Keamanan pada Panggilan Asinkron.

// Set input parameters to ExecQueryAsync.
BSTR QueryLang = SysAllocString(L"WQL");
BSTR Query = SysAllocString(L"SELECT * FROM MyClass");

// Create IWbemObjectSink object and set pointer.
QuerySink *pSink = new QuerySink;

IWbemServices* pSvc = 0;

// Call ExecQueryAsync.
HRESULT hRes = pSvc->ExecQueryAsync(QueryLang, 
                                    Query, 
                                    0, 
                                    NULL, 
                                    pSink);

// Check for errors.
if (hRes)
{
    printf("ExecQueryAsync failed with = 0x%X\n", hRes);
    SysFreeString(QueryLang);
    SysFreeString(Query);
    delete pSink;    
    return ERROR;
}

Catatan

Kode di atas tidak mengkompilasi tanpa kesalahan karena kelas QuerySink belum ditentukan. Untuk informasi selengkapnya tentang QuerySink, lihat IWbemObjectSink.

 

Memanggil Metode