实现物理使用者

物理使用者是实现 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 将开始自动将事件批处理到单个调用中。 自动批处理有助于解决往返时间问题,这与高吞吐量方案中通常的情况一样。 但是,如果客户端或网络带宽出现故障,批处理不会提高系统性能。