呼叫 WMI
提供者可以從其方法實作中呼叫 WMI 所實作的方法。 不過,當提供者從相同的方法本身實作中呼叫 IWbemServices 方法的 WMI 實作時,會有特殊考慮。 不論提供者呼叫方法的同步或非同步版本為何,這些考慮都很重要。
提供者可以實作的每個 IWbemServices 方法都有 pCtx 參數,這是 IWbemCoNtext 介面實作的指標。 當 WMI 呼叫提供者時,WMI 會在此參數中傳遞有效的指標。 提供者必須在服務要求時對 WMI 所做的任何呼叫中傳遞這個相同的指標。 忽略適當地設定 pCtx 可能會導致 WMI 啟動無限迴圈。
下列程式碼範例顯示從GetObjectAsync實作中呼叫GetObject的 WMI 實作的正確方式。
STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pHandler)
{
IWbemClassObject *pclObj = NULL;
IWbemServices* m_pNamespace;
HRESULT hr = m_pNamespace->GetObject(
_bstr_t(L"AClass"), 0, pCtx, &pclObj,
NULL );
pclObj->Release();
return pHandler->SetStatus(0, hr, NULL, NULL);
}
本主題中的 C++ 程式碼範例需要下列參考和#include語句才能正確編譯。
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
實例、類別和屬性提供者在維護讀取要求時,不得對要求修改資料的 WMI 發出任何呼叫。 此規則唯一例外的提供者是發送提供者。 推送提供者是一種類別提供者,會將資料儲存在 WMI 存放庫中,並依賴 WMI 來處理來自用戶端的要求。 在維護讀取要求時,推送提供者可以更新 WMI 存放庫,但必須將lFlags參數設定為適當IWbemServices呼叫中的WBEM_FLAG_OWNER_UPDATE。
服務呼叫時,事件提供者不得進行任何類別變更。 它們也無法發出任何與事件相關的呼叫,例如修改事件篩選。
相關主題