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




相关文章
|
开发框架 JavaScript .NET
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
194 0
|
Windows 网络协议
Windows Mobile远程控制软件Pocket Controller Pro简介
不仅PPC/WindowsMobile系统可以使用该控制软件,只要是WINCE内核的系统都可以使用,我在WinCE.net 4.2系统测试通过,只不过640*480的分辨率,控制速度不是那么理想。
1127 0
|
数据格式 XML Windows
Windows Mobile 5.0编程—奥运场馆速查
我忙里偷闲,用VS2005开发了一个关于奥运场馆的小程序,时值2008北京奥运前夕,也算是为奥运做了“贡献”
770 0
|
2月前
|
安全 数据安全/隐私保护 虚拟化
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
401 2
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
|
2月前
|
安全 Unix 物联网
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
211 0
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
|
2月前
|
存储 SQL 人工智能
Windows Server 2025 中文版、英文版下载 (2025 年 10 月更新)
Windows Server 2025 中文版、英文版下载 (2025 年 10 月更新)
362 0
|
3月前
|
运维 安全 网络安全
Windows Server 2019拨号“找不到设备”?Error 1058解决指南
Windows Server 2019拨号报错1058?别急!这不是硬件故障,而是关键服务被禁用。通过“服务依存关系”排查,依次启动“安全套接字隧道协议”“远程接入连接管理”和“路由与远程访问”服务,仅需4步即可恢复PPPoE或VPN拨号功能,轻松解决网络中断问题。
281 1
|
3月前
|
存储 SQL 人工智能
Windows Server 2025 中文版、英文版下载 (2025 年 9 月更新)
Windows Server 2025 中文版、英文版下载 (2025 年 9 月更新)
1032 3
Windows Server 2025 中文版、英文版下载 (2025 年 9 月更新)
|
3月前
|
安全 Unix 物联网
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 9 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 9 月更新)
321 2