更新时间:2022-02-16 06:04:19
之前写过一些关于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使用的时候需要定义与LcdTemperatureHandler和LcdTouchSensorHandler一样的函数。
void OnLcdTouched ()
{
printf("OnLcdouched\n");
}
void OnTemperatureChanged (double degree)
{
printf("OnTemperatureChanged degree=%d\n", degree);
}
LcdTemperatureRegisterHandler(OnTemperatureChanged);
本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/12/07/Windows-Mobile-Native-DLL-Callback.html,如需转载请自行联系原作者
在Windows Mobile和Wince(Windows Embedded CE)下进行Win32开发,取出窗口句柄的方法
在Windows Mobile和Wince(Windows Embedded CE)下进行WTL开发,如何加入超链接(HyperLink)
在Windows Mobile和Wince(Windows Embedded CE)下封装Native DLL的回调函数
在Windows Mobile和Wince(Windows Embedded CE)下进行Native C++开发,如何取出资源文件中的版本信息
Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发
在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework 取当前运行文件的路径
Windows Mobile 和 Wince(Windows Embedded CE) 下的 WTL(Windows Template Library) 界面(UI)开发