在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\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,如需转载请自行联系原作者




相关文章
|
编解码 Ubuntu 编译器
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
|
8月前
|
安全 搜索推荐 虚拟化
windows系统封装介绍
windows系统封装介绍
143 0
|
8月前
|
Windows
太阳当空照-Windows服务化方式脚本封装sc指令(下)
太阳当空照-Windows服务化方式脚本封装sc指令(下)
74 0
|
8月前
|
Windows
太阳当空照-Windows服务化方式脚本封装sc指令(上)
太阳当空照-Windows服务化方式脚本封装sc指令
121 0
|
8月前
|
网络协议 Linux 编译器
C/C++封装:Windows/Linux下封装.lib/.so文件
这里提供了两个C/C++中服务器与客户端之间通讯的两个程序,程序中封装了通信之间的函数方法,我们以这个程序为例进行封装。
184 0
|
10月前
|
存储 程序员 编译器
windows下的串口编程,串口操作类封装
windows下的串口编程,串口操作类封装
|
Linux API C语言
Windows下静态、动态库的封装和使用(图解)(下)
Windows下静态、动态库的封装和使用(图解)
201 0
Windows下静态、动态库的封装和使用(图解)(下)
|
C语言 Windows
Windows下静态、动态库的封装和使用(图解)(上)
Windows下静态、动态库的封装和使用(图解)
319 0
Windows下静态、动态库的封装和使用(图解)(上)
|
Linux C语言 Windows
Qt开发笔记之编码x264码流并封装mp4(二):windows平台x264添加mp4支持,gpac库的介绍与编译
Qt开发笔记之编码x264码流并封装mp4(二):windows平台x264添加mp4支持,gpac库的介绍与编译
Qt开发笔记之编码x264码流并封装mp4(二):windows平台x264添加mp4支持,gpac库的介绍与编译
|
存储 编解码 Ubuntu
Qt开发笔记之编码x264码流并封装mp4(一):x264介绍、windows平台mingw32编译x264库
Qt开发笔记之编码x264码流并封装mp4(一):x264介绍、windows平台mingw32编译x264库
Qt开发笔记之编码x264码流并封装mp4(一):x264介绍、windows平台mingw32编译x264库