设为首页 加入收藏

TOP

6.2.2 类方法与事件函数
2013-10-07 13:26:16 来源: 作者: 【 】 浏览:65
Tags:6.2.2 方法 事件 函数

6.2.2  类方法与事件函数

KMDF中的事件函数,分开来说:驱动对象有EvtDriverDeviceAdd和EvtDriverUnload,我们将实现前者;设备对象有一系列PNP/Power事件;还有其他对象的事件函数,且忽略之,详见代码。

事件函数说到底是一种回调函数。类普通成员函数,由于编译后会增加this参数,所以无法成为回调函数。只能使用类静态函数,并通过静态函数再回调成员函数。这是一种很通用的实现手段。以EvtDriverDeviceAdd事件函数为例,我们要在类中为它定义两个相关函数。

  1. Class DrvClass  
  2. {  
  3.     // 定义类静态函数,它是全局的,可以作为回调函数  
  4.     static NTSTATUS PnpAdd_sta(  
  5.            IN WDFDRIVER  Driver,  
  6.            IN PWDFDEVICE_INIT  DeviceInit);  
  7.  
  8.     // 再定义类成员函数,将由静态函数内部调用  
  9.     virtual NTSTATUS PnpAdd(  
  10.            IN WDFDRIVER  Driver,  
  11.            IN PWDFDEVICE_INIT  DeviceInit,  
  12.            DrvClass* pThis);  
  13.  
  14.     // 其他接口函数  
  15.     // ……  

要能够通过静态函数回调成员函数,即通过PnpAdd_sta回调PnpAdd函数。前提是要能够获得对象指针,因为我们已经把对象指针保存在驱动对象的环境块中了,所以达到此目的不是难事。代码如下:

  1. NTSTATUS DrvClass::PnpAdd_sta(IN WDFDRIVER Driver,  
  2.                              IN PWDFDEVICE_INIT DeviceInit)  
  3. {  
  4.     // 取得环境块  
  5.     PDRIVEDR_CONTEXT pContext = GetDriverContext(Driver);  
  6.  
  7.     // 环境块中存有对象指针  
  8.     DrvClass* pThis = (DrvClass*)pContext->par1;  
  9.  
  10.     // 再调用成员函数  
  11.     return pThis->PnpAdd(Driver, DeviceInit);  

所有其他的事件函数,都必须采用相同的方法实现。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.2 类封装的驱动程序 下一篇6.2.4 WDM驱动实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: