Bagikan melalui


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"
Parameter ini mungkin NULL.

[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:
    1. Buat permintaan dependen dengan utas yang diterima dari WMI.
    2. 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.

Anda dapat memilih untuk mengimplementasikan penyedia Anda dalam proses. Penyedia dalam proses yang harus terhubung ke WMI secara terpisah dari proses inisialisasi harus menggunakan pengidentifikasi kelas CLSID_WbemAdministrativeLocator untuk mengakses IWbemLocator dalam panggilan ke CoCreateInstance.

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

Lihat juga

IWbemProviderInit

Menginisialisasi Penyedia