最近遇到一个要求,将原来的OCX控件,替换成直接的DLL调用。

遇到OLE的事件回调,写了三个宏,用于简化代码

#define OLE_ENVENT_IN_CLASS_ONE(event_name, func_ret_type, param_type , param_name) \
public: \
typedef struct event_name##Struct { \
CWnd* pThis; \
void (CWnd::* event_name##Callback)( param_type param_name ); \
} event_name##Struct; \
protected: \
event_name##Struct __ole_event_##event_name##StructSt; \
public: \
void _Ole_Event_Set##event_name(const event_name##Struct stCallback) { __ole_event_##event_name##StructSt = stCallback;}; \
func_ret_type _Ole_Event_Call##event_name ( param_type param_name ) { \
if (NULL != __ole_event_##event_name##StructSt . event_name##Callback) { \
(__ole_event_##event_name##StructSt .pThis ->* __ole_event_##event_name##StructSt.event_name##Callback)( param_name ); \
} \
}; #define CALL_OLE_EVENT(event_name, param_name) \
_Ole_Event_Call##event_name(param_name); #define SET_OLE_EVENT_TO_OBJ(event_class, event_name, event_obj, pThis, func_name, param_type , param_name ) \
event_class :: event_name##Struct __temp_ole_event_set##event_name = {(CWnd*)pThis, (void (CWnd::* )( param_type param_name )) & func_name }; \
(event_obj) -> _Ole_Event_Set##event_name( __temp_ole_event_set##event_name );

在类定义中,插入相应的事件

	OLE_ENVENT_IN_CLASS_ONE(EventCallback, void, LPCTSTR, content)

 事件调用处如此执行

    void cwDetectCallback(LPCTSTR content)
{
#ifndef CW_LIB_DEF
FireEvent(eventidcwDetectCallback, EVENT_PARAM(VTS_BSTR), content);
#else
CALL_OLE_EVENT(EventCallback, content);
#endif
}

调用处,原OLE控件初始化处,如下设置

    auto ret = activex_.cwInitControl(_T(""));

    //模拟事件调用
SET_OLE_EVENT_TO_OBJ(CStrCloudWalkControlCtrl, EventCallback, &activex_, this, CCloudWalkLiveDetectDlg::OnLiveDetectCallbackFunc, LPCTSTR, content);

回调函数正常定义。

几个模拟OLE事件注册、调用的宏的更多相关文章

  1. javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)

    前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...

  2. 浅谈Winform事件的实现以及模拟其事件的实现(附实现源码)

    当我们初学Winform的时候被其神奇的事件功能所吸引,当点击一个按钮时,便会跳到我们所写的点击方法当中去.然而这并不符合我们对方法的理解,究竟.net在后面帮助我们实现了什么.我们怎样模拟其事件的实 ...

  3. libevent (三) 事件注册与循环监听

    事件注册与循环监听 在libevent中为了监听某种事件的发生,设置事件触发后的回调函数,也就是说对该事件注册到当前的IO模型中. 事件注册 事件初始化 使用`event_new`函数来对事件进行初始 ...

  4. IOS Storyboard使用-模拟登录、注册、混合使用

    最近分析IOS的占有率,发现5.0以下的少之又少了,故而决定新的App用 Storyboard开发,找了很多资料都是点上的,这个简单的demo是测试代码,发上来,供新手参考. 模拟登录.注册.和显示主 ...

  5. React笔记-事件注册

    事件机制 本系列以React v16.8.3为基础进行源码分析 React事件主要分为两部分: 事件注册与事件分发.下面先从事件注册说起. 事件注册 假设我们的程序如下: <!DOCTYPE h ...

  6. 由object元素引出的事件注册问题和层级显示问题

    项目有一个双击监控视频全屏的需求,视频播放使用的是IE下的ActiveX控件,web页面中使用HTML嵌入对象元素object.预期方案如下: 1.在开发ActiveX控件时加入双击事件. 2.通过d ...

  7. C#中的事件注册和注销

    C#中的事件注册和注销 由于.NET框架对消息循环机制进行了很好的封装,开发人员不再需要深入的了解Windows事件/消息实现的具体机制,也无需创建复杂的事件结构体和所谓的消息句柄.我们所要做的无非就 ...

  8. C# 通过模拟http请求来调用soap、wsdl

    C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...

  9. C++模拟C#事件委托机制(一)

    原文来自于http://www.cnblogs.com/netssfy/articles/1652671.html 写了一段时间的C#代码后确实发现C#的事件委托非常好用.于是便想是否在C++中也能如 ...

随机推荐

  1. 剑指offer 打印从1到最大的n位数

    题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 分析:注意不能直接输入最大的n位十进制数,因为可能属于大数,这个数无法用int或 ...

  2. linux中的文件类型以及查看文件类型的方法

    Linux文件类型和文件的文件名所代表的意义是两个不同的概念,在linux中文件类型与文件扩展名没有关系.它不像Windows那样是依靠文件后缀名来区分文件类型的,在linux中文件名只是为了方便操作 ...

  3. JS中对数组元素进行增、删、改、查的方法,以及其他方法

    前言 昨天联调一个页面,看着就一个页面,接口倒是不少. 热点问题配置测试联调完成(同步异步接口共11个) 1.配置新增 2.配置编辑 3.配置删除 4.热点问题新增 5.热点问题编辑 6.热点问题删除 ...

  4. 通过runtime对类别进行属性的扩展

    category使用  objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性 属性 其实就是 get/set 方法. 我们可以使用 objc ...

  5. Codeforces 959 树构造 暴力求最小字典序互质序列

    A B C 题目给你一个结论 最少需要min((odd,even)个结点可以把一棵树的全部边连起来 要求你输出两颗树 一棵树结论是正确的 另外一棵结论是正确的 正确结论的树很好造 主要是错误的树 题目 ...

  6. Android相关资源

    各类黑客大会资料 https://infocon.org/cons/ 各类课程.视频 https://github.com/Developer-Y/cs-video-courses#security ...

  7. mac+react-native环境搭建

    主要参考 https://reactnative.cn/docs/getting-started.html react-native中文网 IOS版 1.Node v10以上.Watchman 和 R ...

  8. uoj207 共价大爷游长沙 子树信息 LCT + 随机化 + 路径覆盖

    题目传送门 http://uoj.ac/problem/207 题解 如果是一棵静态的树,有一个非常容易想到的算法:统计一下目前的每一个条边被几条路径经过,如果 \(x\) 到 \(y\) 的边的这个 ...

  9. 【前端】DOM操作

    1 什么是DOM 全称 Document Object Model 文档对象模型. 一个web页面的展示,是由html标签组合成的一个页面,dom对象实际就是将html标签转换成了一个文档对象.可以通 ...

  10. JavaSE---泛型系统学习

    1.概述 1.1.泛型: 允许在   定义  类.接口.方法时  使用  类型形参,这个类型形参  将在声明变量.创建对象.调用方法时  动态地指定: 1.2.jdk5后,引入了  参数化类型(允许程 ...