Share via


IWbemProviderInit::Initialize 方法 (wbemprov.h)

Windows 管理會呼叫 IWbemProviderInit::Initialize 方法,以初始化提供者以接收用戶端要求。 所有類型的提供者都必須實作這個方法。

語法

HRESULT Initialize(
  [in] LPWSTR                wszUser,
  [in] LONG                  lFlags,
  [in] LPWSTR                wszNamespace,
  [in] LPWSTR                wszLocale,
  [in] IWbemServices         *pNamespace,
  [in] IWbemContext          *pCtx,
  [in] IWbemProviderInitSink *pInitSink
);

參數

[in] wszUser

如果使用者名稱的指標是在此提供者 的__Win32Provider 註冊實例中要求每個使用者初始化,則為 。 否則,這會是 NULL

請注意,不論提供者的 __Win32Provider 實例中的 PerUserInitialization 屬性值為何,這個參數都會設定為事件取用者提供者的 NULL

[in] lFlags

保留的。 此參數必須是 0 (零) 。

[in] wszNamespace

初始化提供者的命名空間名稱。

[in] wszLocale

要初始化提供者的地區設定名稱。

下列格式的字串,其中十六進位值是 Microsoft 標準 LCID 值:

  • “MS_409”
此參數可以是 NULL

[in] pNamespace

IWbemServices 指標回到 Windows 管理。 這個指標可以服務提供者提出的任何要求。 如果提供者在執行期間要回呼 Windows 管理,提供者應該在此指標上使用 IWbemProviderInit::AddRef 方法。

[in] pCtx

與初始化相關聯的 IWbemContext 指標。 此參數可以是 NULL

如果提供者會在完成初始化之前執行回 Windows 管理的要求,它應該在此指標上使用 IWbemProviderInit::AddRef 方法。 如需詳細資訊,請參閱 呼叫 WMI

如果提供者必須對另一個提供者提出相依要求,您必須將此內容字串傳回 WMI,以避免潛在的鎖定。 不過,在獨立要求的情況下,這並非必要,而且 WMI 會為其產生新的內容字串。

[in] pInitSink

提供者用來報告初始化狀態的 IWbemProviderInitSink 指標。

傳回值

提供者應該傳回 WBEM_S_NO_ERROR ,並使用 pInitSink 參數中提供的物件接收來指出其狀態。 不過,如果提供者傳回 WBEM_E_FAILED 且不使用接收,則會將提供者初始化視為失敗。

備註

提供者通常會使用多個繼承來實作 COM 物件,以支援 IWbemProviderInit 介面及其主要介面,例如 IWbemServices 或 IWbemEventProvider

呼叫 IWbemProviderInitSink::SetStatus 來報告初始化狀態。 如有必要,可以重複呼叫這個方法來報告累加狀態。 提供者必須先呼叫其 IWbemProviderInit::AddRef 方法,以遞增此指標上的參考計數,才能使用它來與 Windows 管理通訊狀態。

提供者可以同步使用 IWbemProviderInitSink 指標,如下列程式代碼範例所示。

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;
}

提供者也可以使用指標上的 AddRef 方法,並建立個別線程來完成其初始化,並立即從呼叫傳回。

某些提供者的初始化程式可能包括回呼 WMI。 呼叫回 WMI 且必須等候該呼叫完成的提供者稱為相依提供者。 同樣地,對 WMI 的呼叫稱為相依要求。 實作 Initialize 時,WMI 要求相依提供者遵守下列規則:

  • 相依要求必須重複使用 WMI 傳遞至 InitializeIWbemContext 指標。

    這表示在初始化期間對 WMI 所做的任何呼叫都必須重複使用 WMI 傳入的 IWbemContext 指標。 無法這麼做可能會導致死結。

  • 非相依要求不得重複使用 IWbemContext 指標。
  • 相依提供者必須使用下列兩種策略之一向 WMI 提出要求:
    1. 使用從 WMI 接收的線程提出相依要求。
    2. 使用提供者所建立的新線程提出相依要求。
  • 所有提供者都必須傳回從 WMI 接收的線程。
  • 在任何情況下,WMI 都允許提供者封鎖從 WMI 接收的線程。

    不小心處理 WMI 所傳遞線程的危險是提供者可能會取得 WMI 線程集區中的所有線程,並繼續封鎖這些線程。 這會導致死結系統。

您可以選擇在進程中實作提供者。 必須與初始化進程分開連線到 WMI 的同進程提供者,必須使用 CLSID_WbemAdministrativeLocator 類別標識碼,在對 CoCreateInstance 的呼叫中存取 IWbemLocator

下列程式代碼範例說明如何在這類呼叫中使用 CLSID_WbemAdministrativeLocator 標識碼。

  IWbemLocator *pLoc = 0;

  DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, 
      CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

無法使用 CLSID_WbemAdministrativeLocator 標識碼會導致拒絕存取錯誤。 如需建立 WMI 連線的詳細資訊,請參閱 建立 WMI 應用程式或腳本

範例

下列程式代碼範例說明如何實作事件取用者提供者的 Initialize

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;
}

規格需求

需求
最低支援的用戶端 Windows Vista
最低支援的伺服器 Windows Server 2008
目標平台 Windows
標頭 wbemprov.h (包含 Wbemidl.h)
程式庫 Wbemuuid.lib
Dll Wbemsvc.dll

另請參閱

IWbemProviderInit

初始化提供者