当前位置: 首页 > news >正文

在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);
}

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

LcdTouchSensorRegisterHandler(OnLcdTouched);
LcdTemperatureRegisterHandler(OnTemperatureChanged);

相关文章:

  • 【转】Windows GUI自动化测试技术的比较和展望
  • dbf文件修复
  • 在Salesforce中编写Unit Test
  • oracle sql获取随机数
  • WM有约II(七):番外篇
  • PHP中的include功能
  • 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄
  • ffdshow 源代码分析1 : 整体结构
  • 关于一道面试题,使用C#实现字符串反转算法
  • 开源科学计算语言Fortress
  • java范型简介
  • 敏捷软件开发实践-Sprint Retrospective Meeting(转)
  • WebSocket桌面客户端工具
  • docker与虚拟机性能比较
  • 匿名方法实现多线程同步到主线程执行
  • JavaScript 如何正确处理 Unicode 编码问题!
  • __proto__ 和 prototype的关系
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017前端实习生面试总结
  • 2019.2.20 c++ 知识梳理
  • Date型的使用
  • docker容器内的网络抓包
  • Fundebug计费标准解释:事件数是如何定义的?
  • java 多线程基础, 我觉得还是有必要看看的
  • java第三方包学习之lombok
  • js ES6 求数组的交集,并集,还有差集
  • overflow: hidden IE7无效
  • 从PHP迁移至Golang - 基础篇
  • 规范化安全开发 KOA 手脚架
  • 如何利用MongoDB打造TOP榜小程序
  • 实习面试笔记
  • 手机端车牌号码键盘的vue组件
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (4.10~4.16)
  • (C语言)二分查找 超详细
  • (Git) gitignore基础使用
  • (Java数据结构)ArrayList
  • (SpringBoot)第七章:SpringBoot日志文件
  • (笔试题)分解质因式
  • (二)pulsar安装在独立的docker中,python测试
  • (四)鸿鹄云架构一服务注册中心
  • (转)Linq学习笔记
  • (转)Sublime Text3配置Lua运行环境
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core 2.1路线图
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net2005怎么读string形的xml,不是xml文件。
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [20150629]简单的加密连接.txt
  • [383] 赎金信 js
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BJDCTF2020]The mystery of ip