共用方式為


實作實體取用者

實體取用者是實作 IWbemUnboundObjectSink 介面的 COM 物件。 WMI 會載入您的實體取用者,並透過 IWbemUnboundObjectSink 傳遞事件,以回應一或多個事件,如相關聯的邏輯取用者所定義。 永久取用者具有特殊安全性需求。 如需詳細資訊,請參閱 保護 WMI 事件

下列程式描述如何實作永久事件取用者的實體取用者。

為永久事件取用者實作實體取用者

  1. 建立 COM 物件。

    您必須使用 COM 通訊協定,將實體取用者實作為本機或遠端伺服器。

  2. 判斷您是否要支援同步或非同步事件通知。

    透過非同步事件通知,傳送執行緒與接收執行緒無關。 因此,WMI 和事件提供者都不會在 WMI 將通知傳遞給任何已註冊接收事件的取用者時遭到封鎖。 非同步傳遞的缺點是在提供者產生事件與取用者收到事件的時間之間發生內容切換。 如需非同步運作的詳細資訊,請參閱 Microsoft Windows 軟體發展工具組 (SDK) 的 COM 一節中的 COM 基本概 念主題。 如需內容切換的詳細資訊,請參閱 Windows SDK 的 DLL、進程和執行緒一節中的 內容切換 主題。

    注意

    由於對接收的回呼可能不會與用戶端所需的相同驗證層級傳回,因此建議您使用半非同步而非非同步通訊。 如需詳細資訊,請參閱 呼叫方法

     

    透過同步通知,WMI 會在事件提供者用來將事件傳遞至 WMI 的相同執行緒上傳遞通知。 在此情況下,當事件提供者傳送通知時,WMI 會封鎖事件提供者,直到 WMI 傳遞通知為止。 只有當取用者非常快速且可以在 100 微秒或更少秒內處理事件時,才應考慮支援同步通知。 處理事件的同步取用者需要太長的時間,可能會讓事件傳遞至所有其他取用者的速度變慢。 此外,他們可以不小心封鎖提供者。 如需詳細資訊,請參閱 使用邏輯取用者系結事件篩選

  3. 實作 IWbemUnboundObjectSink::IndicateToConsumer 函式。

    WMI 使用 IndicateToConsumer 函式,將必要的指標和事件傳遞至實體取用者,以進行同步和非同步通訊。 您的 IndicateToConsumer 實作應該包含回應事件所需的所有必要程式碼。

    不同于暫時事件取用者,您不需要呼叫 IWbemLocator 介面來連絡 WMI。 相反地,WMI 會透過事件取用者提供者找出取用者的指標。 如需詳細資訊,請參閱 撰寫事件取用者提供者

    不過,如果您想要回呼 WMI,請使用 IWbemLocatorIWbemServices 介面。 連線到 WMI 的傳統方法是在 COM 物件的初始化程式期間。 如需詳細資訊,請參閱 建立 WMI 應用程式或腳本

    如果您實作實體取用者做為同進程 COM 伺服器,並且與初始化程式分開連線到 WMI,則必須使用CLSID_WbemAdministrativeLocator類別識別碼來存取CoCreateInstance呼叫中的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 就會開始自動將事件批次處理成單一呼叫。 自動批次處理有助於發生往返時間的問題,如同在高輸送量案例中的情況一樣。 不過,如果用戶端或網路頻寬發生錯誤,批次處理並不會改善系統效能。