在Windows Mobile和Wince(Windows Embedded CE)下封装Native DLL的回调函数

回调函数 dll,c# dll回调,回调函数,回调函数406错误 ,www.515158.com

在Windows Mobile和Wince(Windows Embedded CE)下封装Native DLL的回调函数

背景

之前写过一些关于Native DLL封装的文章,链接如下:

Windows Mobile和Wince(Windows Embedded CE)下如何封装Native DLL提供给.NET Compact Framework进行调用

Windows Mobile和Wince(Windows Embedded CE)下封装Native DLL进一步探讨

如何在Windows Mobile下使用Native C++动态加载DLL

 

缘由

有时候这个封装的DLL需要为Client提供异步的通知,需要使用到回调函数。如果不是纯C的DLL下,进行异步通知,我一般使用Oberver模式的方式来通知Client。但是在封装纯C的Native DLL,就不能使用该方法了。关于Oberver模式,请参考 我的实用设计模式之Observer模式

 

解决方案

下面以一个LCD touch screen的温度和触摸回调函数的封装作为例子讲述如何封装回调函数。

定义

#ifdef LCD_EXPORTS
#define LCD_API extern "C" __declspec(dllexport)
#else
#define
LCD_API extern "C" __declspec(dllimport)
#endif

/**
* Function signature for callback event handlers.
*/
typedef void (__stdcall *LcdTemperatureHandler) (double degree);
typedef void (__stdcall *LcdTouchSensorHandler) ();

LCD_API void LcdTemperatureRegisterHandler( LcdTemperatureHandler handler );
LCD_API void LcdTouchSensorRegisterHandler( LcdTouchSensorHandler handler );

LCD_API void LcdTemperatureUnregisterHandler();
LCD_API void LcdTouchSensorUnregisterHandler();

分别定义温度和触摸的回调函数的函数指针LcdTemperatureHandler和LcdTouchSensorHandler。LcdTemperatureHandler回调的时候同时传递温度的值(degree)。LcdTemperatureRegisterHandler和LcdTouchSensorRegisterHandler为注册函数,参数为以LcdTemperatureHandler和LcdTouchSensorHandler为原先的全局函数或者静态成员函数。

 

实现

LcdTemperatureHandler gLcdTemperatureHandler = NULL;
LcdTouchSensorHandler gLcdTouchSensorHandler = NULL;

void LcdTemperatureRegisterHandler( LcdTemperatureHandler handler )
{
gLcdTemperatureHandler = handler;
}

void LcdTouchSensorRegisterHandler( LcdTouchSensorHandler handler )
{
gLcdTouchSensorHandler = handler;
}

void LcdTemperatureUnregisterHandler()
{
gLcdTemperatureHandler = NULL;
}

void LcdTouchSensorUnregisterHandler()
{
gLcdTouchSensorHandler = NULL;
}

实现的时候需要一个全局变量或者静态成员变量保存函数指针。

void LcdTouched()
{
if( gLcdTouchSensorHandler != NULL)
{
gLcdTouchSensorHandler();
}
}

void LcdTemperatureChanged()
{
double temperature = 30.2;
if( gLcdTemperatureHandler != NULL)
{
gLcdTemperatureHandler(temperature);
}
}

需要的时候调用这些函数指针来回调已注册的函数。

 

Client

Client使用的时候需要定义与LcdTemperatureHandler和LcdTouchSensorHandler一样的函数。

void OnLcdTouched ()
{
printf("OnLcdouched ");
}

void OnTemperatureChanged (double degree)
{
printf("OnTemperatureChanged degree=%d ", degree);
}

把这些函数作为参数传递到注册函数。


LcdTemperatureRegisterHandler(OnTemperatureChanged);



本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/12/07/Windows-Mobile-Native-DLL-Callback.html,如需转载请自行联系原作者




OA  OA软件  OA系统  OA办公系统  协同OA软件  OA办公软件  开源OA  协同OA  PHPOA  oa  企业信用查询 回调函数不执行  回调函数406错误  回调函数  js中this绑定问题  socket文件传输分包  jpages  电路图  sql 报表设计  图形化数据数据库  phpjavascript  logcatandroid  帮帮忙大神谢谢了  nginx tomcat负载均衡  popover  csphere  希云  寻址寄存器  代码startbodyapiapi设计  arraylistwinformlist数据库  dragover拖拽网页drop  jsphp  visual active x  hyper v  reduce个数  reduce任务  非法请求包 类的原因  字符串指针 内存非法  贝塞尔重复路径非法  bool false  bool 警告消除  bool变量  bool  非法访问  控件数组  Overview  数组赋值  java对象数组详解  ireportssh  list安卓  mingwdll  类定义  多重定义  宏定义  未定义  stm32 ucos...  rewrite  spring json  获取分辨率  ic卡读卡器  mpinj读卡器通信协议