SENS:系统事件通知服务 和 WMI 支持灵活而有效的移动网络计算( 四 )


在设置您的接口以后,您就可以注册它以便接收事件了 。要接收通知,您的接口必须预订 SENS 事件 。
返回页首
预订事件
对 SENS 事件的订阅是通过接口添加的 。该接口是由对象 () 实现的,而该对象在SDK 文件 .h 中定义 。
的 Store 方法添加了一个订阅 。
HRESULT Store (BSTR ProgID,IUnknown *pInterface);
该方法的参数总是被设置为 tion,并且接口指针被设置为。该接口在系统类 (ion) 中实现,并且用于封装订户和发布程序之间的关系 。对象也在文件 .h 中定义 。
您需要向提供订阅的说明性名称、发布程序的 GUID、指向订户接口的指针 。我将简要说明上述各项 。
订阅的说明性名称是一个用于标识订阅的名称;它通过设置:
HRESULT IEventSubscription::put_SubscriptionName(BSTR bstrSubscriptionName);
您可以通过方法提供将激发事件的发布程序的 GUID:
HRESULT IEventSubscription::put_EventClassID(BSTR bstrEventClassID);
用于标识类 ID 的 BSTR 是发布程序的 GUID 的字符串表示形式 。对于通知,它被设置为 LOGON 。该常数在SDK 的文件 Sens.h 节中定义 。
最后,指向订户接口的指针必须被传递给。实现接口的被初始化,并且它的接口指针在调用中传递,如下面的代码所示:
HRESULT IEventSubscription:: put_SubscriberInterface(IUnknown ifpSubscriberInterface);
还有另外一个标识订户接口的方法,值得顺便提一下:
HRESULT IEventSubscription:: put_SubscribeCLSID(BSTR bstrSubscriberCLSID);
在指定短暂订阅时,总是使用第一个方法 。CLSID 必须为 NULL;永远不得进行第二次调用 。您还可以通过调用第二个方法并指定 CLSID 来设置持久订阅 。在这种情况下,必须将订户接口设置为 NULL 。在本文的示例代码中,短暂订阅是使用第一个方法建立的 。
这就是所有的步骤 。在准备好对象之后,就可以将其传递给前面介绍的对象的 Store 方法 。如果该过程中的所有都返回成功,则您就设置了一个短暂订阅并且做好开始接收通知的准备 。
对于 SENS 中提供的其他两个接口,需要遵循完全相同的过程 。Sens.h 中定义的其余两个接口的 GUID 常数是和 ONNOW 。
我的示例文件 .cpp 和 .h(可通过本文顶部的链接下载)包含用于注册所有 SENS 通知的源代码 。
返回页首
存在的问题
遗憾的是,的工作方式如此奇特,以至于许多人认为通知根本就不工作 。它们的确能够工作;只是它们通常需要很长时间才能激发(最多需要五分钟) 。当连接是拨号连接时,这些通知实际上接近于即时,并且非常便于使用 。对于 LAN 和 WAN 连接,等待时间太长,以至于无法在程序中使用,因为移动用户在得知其连接断开之前,不会特别耐心地等待那么长时间 。
当我测试通知时,我得到了混合的结果 。通常,经过五分钟之后,通知仍然尚未激发 。事实上,半小时之后,它仍然未能激发 。启动5.5(这会导致在用户计算机上安装事件)时,总是会导致通知被激发 。
如果正在运行,则我会得到一个通知,但不会得到连续的通知,而且我根本不会得到通知 。对于,仅仅将打开是不够的 。我必须在每次希望得到通知时启动它 。无庸讳言,采用变通办法是不可能的 。
那么,如果至关重要而又不能工作,还有什么其他选择呢?还有另外一个选择,但它要求仔细研究Kit (DDK) 。
【SENS:系统事件通知服务 和 WMI 支持灵活而有效的移动网络计算】返回页首
管理规范
WBEM 是一个开放式倡仪,它指定了组件如何提供统一的企业管理 。WBEM 实际上是一组标准,它指定了如何定义数据(使用公共信息模型 — CIM)、如何对数据进行编码 () 以及如何传输数据(HTTP 上的 CIM 操作) 。将这些支持 Web 的规范结合起来,可以使管理工具能够以标准方式从多种支持的设备中请求和获取数据,并将其呈现给用户 。