實作實體消費者
實體消費者是一個 COM 物件,實作了 IWbemUnboundObjectSink 介面。 WMI 會載入您的實體使用者,並透過 IWbemUnboundObjectSink 傳遞事件,以響應由相關邏輯使用者所定義的一或多個事件。 永久取用者有特殊的安全性需求。 如需詳細資訊,請參閱 保護 WMI 事件。
下列程序描述如何為永久事件消費者設置一個具體的消費者。
為持久事件使用者實作一個實體使用者
建立 COM 物件。
您必須使用 COM 通訊協定,將實體取用者實作為本機或遠端伺服器。
判斷您是否要支援同步或異步事件通知。
使用異步事件通知,傳送線程與接收線程無關。 因此,WMI 和事件提供者都不會在 WMI 傳遞通知給任何已註冊接收事件的取用者時遭到封鎖。 異步傳遞的缺點是,在提供者產生事件與取用者收到事件的時間之間發生內容切換。 如需異步運作的詳細資訊,請參閱 Microsoft Windows 軟體開發工具包 (SDK) 的 COM 一節中的 COM 基本概念 主題。 如需內容切換的詳細資訊,請參閱 Windows SDK 的 DLL、進程和線程一節中的 內容交換器 主題。
注意
因為到接收端的回調函數可能不會在用戶端所需的相同驗證層級傳回,因此建議您使用半同步,而不是異步通訊。 如需詳細資訊,請參閱 呼叫 方法。
使用同步通知,WMI 會在事件提供者用來將事件傳遞至 WMI 的相同線程上傳遞通知。 在此情況下,當事件提供者傳送通知時,WMI 會封鎖事件提供者,直到 WMI 傳遞通知為止。 只有當取用者非常快速且可以在 100 毫秒以下處理事件時,才考慮支援同步通知。 處理事件的同步取用者如果耗時過長,可能會大幅延遲事件傳遞至所有其他取用者的速度。 此外,他們可能不小心封鎖服務提供者。 如需詳細資訊,請參閱 使用邏輯使用者綁定事件篩選器。
實作 IWbemUnboundObjectSink::IndicateToConsumer 函式。
WMI 會使用 IndicateToConsumer 函式,將必要的指標和事件傳遞至實體取用者,以進行同步和異步通訊。 您實作的 IndicateToConsumer 應該包含回應事件所需的所有程式代碼。
不同於臨時事件消費者,您不需要呼叫 IWbemLocator 介面來聯絡 WMI。 相反地,WMI 會透過事件使用者提供程式定位到使用者的指標。 如需詳細資訊,請參閱 撰寫事件取用者提供者。
不過,如果您想要回呼 WMI,請使用 IWbemLocator 和 IWbemServices 介面。 連接到 WMI 的傳統方法是在 COM 物件的初始化程序期間。 如需詳細資訊,請參閱 建立 WMI 應用程式或文稿。
如果您將實體取用者實作為同進程 COM 伺服器,並在初始化過程中分開連接到 WMI,則必須在呼叫 CoCreateInstance時使用 CLSID_WbemAdministrativeLocator 類別識別碼來存取 IWbemLocator 介面。
下列範例示範如何使用 CLSID_WbemAdministrativeLocator 類別標識符來存取 IWbemLocator 介面。
IWbemLocator *pLoc = 0; DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
IWbemLocator 介面會取得特定主電腦上 WMI 的初始命名空間指標。 未使用在 CoCreateInstance 呼叫中的 CLSID_WbemAdministrativeLocator 識別碼會導致「拒絕存取」錯誤。
在一般情況下,WMI 會一次將異步事件傳遞至用戶端。 不過,如果客戶端無法以事件抵達的速度接收異步事件通知,WMI 就會開始自動將事件批次處理成單一呼叫。 自動批處理可以幫助解決來回時間問題,正如在高吞吐量情況中常見的那樣。 不過,如果用戶端或網路頻寬發生錯誤,批處理並不會改善系統效能。