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


返回页首
提供了三个与电源状态有关的通知:当计算机切换到 AC 或电池电源时,或者当电池电量不足时 。这些通知是通过接口传递的 。
HRESULT OnACPower(void);
每当计算机从电池电源切换到 AC 电源时,将调用该方法 。如果您的膝上型电脑位于网络中,则它很可能使用卡调制解调器或无线 NIC 卡 。典型的 WLAN卡在传输无线信号时一般使用 350mA,而在接收无线信号时一般使用 250mA 。一种好方法是在使用电池电源时,尽可能地避免使用 WLAN 卡,以便减小电源消耗 。
当计算机使用电池电源时,应用程序可以使用该信息,并且决定在本地缓存要通过网络发送的数据 。当计算机切换到 AC 电源时,应用程序就可以发送或接收数据 。
无法保证用户将切换到 AC 电源 。并且即使该用户确实这样做了,也无法知道计算机是否仍然在无线网络的有效范围内 。编写此类优化代码时,要求详细了解客户在移动网络中的移动方式以及他们处理其数据的方式 。
当用户切换到电池时,将使用计算机的活动电池中剩余的电池电量的百分比来调用该方法:
HRESULT OnBatteryPower(DWORD dwBatteryLifePercent);
方法在用户已经从 AC 切换到电池电源后定期调用:
HRESULT BatteryLow (DWORD dwBatteryLifePercent);
但是,我从未能够从得到该通知,即使在我的电池电量耗尽时 。
返回页首
接收通知
既然我们已经讨论了 SENS 通知以及如何使用它们来优化移动应用程序,那么我将介绍一下如何设置订户以接收这些事件 。
COM+ 订阅可以是持久的,也可以是短暂的 。持久订阅将在重新启动后得到维持,而短暂订阅则不会得到维持 。我将不会详述 COM+ 发布程序-订户模型的特定方面 。相反,我将向您介绍 David Platt 撰写的文章“The COM+ EventEases the Pain ofandto Data”(MSJ 1999 年 9 月刊) 。
为了预订 SENS 通知,我将设置一个短暂订阅,并且向您演练为接口创建对象的步骤 。我将使用 ATL,它使我可以在框架许可的范围内尽可能地接近 COM 。
第一步是创建一个简单的 ATL 可执行应用程序 。在 New列表中选择 ATL Com,并使用中的(参见图 1) 。
图 1 ATL COM
接下来,在该项目中插入一个简单的 ATL 对象 。我调用了我自己的 (参见图 2) 。该过程在我的项目中创建了一个名为的类 。
图 2
从中的类查看器中,右键单击并选择菜单选项 。您将看到一个警告对话框,表明无法找到该项目的类型库 。单击 OK 关闭该对话框并继续 。
图 3 浏览类型库
接下来,您将看到一个使您可以浏览可用类型库的对话框(参见图 3) 。如果您在向类中添加接口之前编译该项目,您将看到的对话框的选项卡中不会列出任何内容(参见图 4) 。单击右侧的 Add按钮,将显示Type对话框 。向下滚动,直到您找到 SENSType(1.0) 。请注意,该对话框告诉您该类型库是由 C:/Winnt//Sens.dll 实现的 。请选中 SENSType旁边的框,并单击 OK 。
图 4
选项卡现在将被添加到对话框中 。前面讨论过的三个接口都将列出来 。选中接口旁边的复选框,并单击 OK 。这将在中插入接口的方法实现 。每个方法都是空的占位符并且返回。您将需要根据您希望处理每个事件的方式来填写各个方法 。
要将该类附加到接口,您将必须向 IDL 文件中添加此处指示的两行代码:
library SENSOMETERLib{importlib("stdole32.tlb");importlib("stdole2.tlb");import "SensEvts.idl"; //add this linecoclass SensLogonSpy{[default] interface ISensLogonSpy;interface ISensLogon; //add this line};};
必须将接口添加到中,以表明类将实现接口 。要导入 (实际上还包括任何 SENS 接口)的定义,您还必须导入 .idl,它与SDK 一起发行 。文件 .cpp 和 .h(可以通过本文下载)包含实现接口所需的所有源代码 。