IWbemProviderInit::Initialize method (wbemprov.h)
Metode IWbemProviderInit::Initialize dipanggil oleh Manajemen Windows untuk menginisialisasi penyedia untuk menerima permintaan klien. Semua jenis penyedia harus menerapkan metode ini.
Sintaks
HRESULT Initialize(
[in] LPWSTR wszUser,
[in] LONG lFlags,
[in] LPWSTR wszNamespace,
[in] LPWSTR wszLocale,
[in] IWbemServices *pNamespace,
[in] IWbemContext *pCtx,
[in] IWbemProviderInitSink *pInitSink
);
Parameter
[in] wszUser
Penunjuk ke nama pengguna, jika inisialisasi per pengguna diminta dalam instans pendaftaran __Win32Provider untuk penyedia ini. Jika tidak, ini NULL.
Ketahuilah bahwa parameter ini diatur ke NULL untuk penyedia konsumen peristiwa terlepas dari nilai properti PerUserInitialization dalam instans __Win32Provider untuk penyedia.
[in] lFlags
Dicadangkan. Parameter ini harus 0 (nol).
[in] wszNamespace
Nama namespace layanan tempat penyedia diinisialisasi.
[in] wszLocale
Nama lokal tempat penyedia sedang diinisialisasi.
String format berikut, di mana nilai heksa adalah nilai LCID standar Microsoft:
- "MS_409"
[in] pNamespace
Penunjuk IWbemServices kembali ke Manajemen Windows. Pointer ini dapat melayani permintaan apa pun yang dibuat oleh penyedia. Penyedia harus menggunakan metode IWbemProviderInit::AddRef pada pointer ini jika akan memanggil kembali ke Manajemen Windows selama eksekusinya.
[in] pCtx
Penunjuk IWbemContext yang terkait dengan inisialisasi. Parameter ini mungkin NULL.
Jika penyedia akan melakukan permintaan kembali ke Manajemen Windows sebelum menyelesaikan inisialisasi, penyedia harus menggunakan metode IWbemProviderInit::AddRef pada pointer ini. Untuk informasi selengkapnya, lihat Melakukan Panggilan ke WMI.
Jika penyedia harus membuat permintaan dependen pada penyedia lain, Anda harus meneruskan string konteks ini kembali ke WMI untuk menghindari potensi penguncian. Namun, dalam kasus permintaan independen, ini tidak diperlukan, dan WMI menghasilkan string konteks baru untuk itu.
[in] pInitSink
Penunjuk IWbemProviderInitSink yang digunakan oleh penyedia untuk melaporkan status inisialisasi.
Nilai kembali
Penyedia harus mengembalikan WBEM_S_NO_ERROR dan menunjukkan statusnya menggunakan sink objek yang disediakan dalam parameter pInitSink . Namun, jika penyedia mengembalikan WBEM_E_FAILED dan tidak menggunakan sink, maka inisialisasi penyedia dianggap gagal.
Keterangan
Biasanya, penyedia mengimplementasikan objek COM menggunakan beberapa warisan untuk mendukung antarmuka IWbemProviderInit serta antarmuka utamanya, seperti IWbemServices atau IWbemEventProvider.
Status inisialisasi dilaporkan dengan memanggil IWbemProviderInitSink::SetStatus. Metode ini dapat dipanggil berulang kali untuk melaporkan status inkremental jika perlu. Penyedia harus menambah jumlah referensi pada pointer ini dengan memanggil metode IWbemProviderInit::AddRef sebelum menggunakannya untuk mengomunikasikan status ke Manajemen Windows.
Penyedia dapat menggunakan pointer IWbemProviderInitSink secara sinkron, seperti dalam contoh kode berikut.
HRESULT SampleProvider::Initialize(
/* [unique][in] */ LPWSTR wszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR wszNamespace,
/* [unique][in] */ LPWSTR wszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
)
{
// Use AddRef on the pNamespace pointer, if required.
// Analyze other parameters.
// Tell Windows Management that you are initialized.
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
return WBEM_S_NO_ERROR;
}
Penyedia juga dapat menggunakan metode AddRef pada penunjuk dan membuat utas terpisah untuk menyelesaikan inisialisasinya dan segera kembali dari panggilan.
Proses inisialisasi beberapa penyedia dapat melibatkan panggilan kembali ke WMI. Penyedia yang memanggil kembali ke WMI dan harus menunggu panggilan tersebut selesai disebut penyedia dependen. Demikian pula, panggilan ke WMI disebut permintaan dependen. Saat menerapkan Inisialisasi, WMI mengharuskan penyedia dependen mematuhi aturan berikut:
-
Permintaan dependen harus menggunakan kembali penunjuk IWbemContext yang diteruskan WMI ke Inisialisasi.
Ini berarti bahwa setiap panggilan ke WMI yang dilakukan selama inisialisasi harus menggunakan kembali pointer IWbemContext yang diteruskan WMI. Kegagalan untuk melakukannya dapat mengakibatkan kebuntuan.
- Permintaan yang tidak bergantung tidak boleh menggunakan kembali penunjuk IWbemContext .
-
Penyedia dependen harus membuat permintaan ke WMI dengan menggunakan salah satu dari dua strategi berikut:
- Buat permintaan dependen dengan utas yang diterima dari WMI.
- Buat permintaan dependen dengan utas baru yang dibuat oleh penyedia.
- Semua penyedia harus mengembalikan utas yang diterima dari WMI.
-
Dalam keadaan apa pun WMI memungkinkan penyedia untuk memblokir utas yang diterima dari WMI.
Bahaya dalam tidak hati-hati menangani utas yang dikirimkan oleh WMI adalah bahwa penyedia dapat memperoleh semua utas di kumpulan utas WMI dan melanjutkan untuk memblokir utas tersebut. Ini akan mengakibatkan sistem yang mengalami kebuntuan.
Contoh kode berikut menjelaskan cara menggunakan pengidentifikasi CLSID_WbemAdministrativeLocator dalam panggilan seperti itu.
IWbemLocator *pLoc = 0;
DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
Kegagalan untuk menggunakan pengidentifikasi CLSID_WbemAdministrativeLocator menghasilkan kesalahan Akses Ditolak. Untuk informasi selengkapnya tentang membuat koneksi ke WMI, lihat Membuat Aplikasi atau Skrip WMI.
Contoh
Contoh kode berikut menjelaskan cara menerapkan Inisialisasi untuk penyedia konsumen peristiwa.
HRESULT CMyEventConsumer::Initialize(
/* [in] */ LPWSTR pszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR pszNamespace,
/* [in] */ LPWSTR pszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
)
{
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
// Optionally, examine the namespace, locale, and so on
// being used.
return WBEM_S_NO_ERROR;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows Vista |
Server minimum yang didukung | Windows Server 2008 |
Target Platform | Windows |
Header | wbemprov.h (termasuk Wbemidl.h) |
Pustaka | Wbemuuid.lib |
DLL | Wbemsvc.dll |