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”
[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 傳遞至 Initialize 的 IWbemContext 指標。
這表示在初始化期間對 WMI 所做的任何呼叫都必須重複使用 WMI 傳入的 IWbemContext 指標。 無法這麼做可能會導致死結。
- 非相依要求不得重複使用 IWbemContext 指標。
-
相依提供者必須使用下列兩種策略之一向 WMI 提出要求:
- 使用從 WMI 接收的線程提出相依要求。
- 使用提供者所建立的新線程提出相依要求。
- 所有提供者都必須傳回從 WMI 接收的線程。
-
在任何情況下,WMI 都允許提供者封鎖從 WMI 接收的線程。
不小心處理 WMI 所傳遞線程的危險是提供者可能會取得 WMI 線程集區中的所有線程,並繼續封鎖這些線程。 這會導致死結系統。
下列程式代碼範例說明如何在這類呼叫中使用 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 |