最近遇到一个要求,将原来的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);

回调函数正常定义。

最新文章

  1. CentOS7.2 创建本地YUM源和局域网YUM源
  2. Java Hour 29 Weather ( 2 ) Maven
  3. RDO部署openstack(2)
  4. 分页写入文件,第二次分页前一定要关闭IO流啊。。否则文件写不全。。- -粗心
  5. IntelliJ IDEA的下载、安装和WordCount的初步使用(本地模式和集群模式)
  6. 用Visual Studio创建集成了gtest的命令行工程
  7. 图片输出onerror事件
  8. css-选择器-优先级
  9. HD1083 二分图,匈牙利算法
  10. 如何关闭IE浏览器在生成原型时候的安全警告
  11. BZOJ_4518_[Sdoi2016]征途_斜率优化
  12. 局部敏感哈希(LSH)之simhash和minhash
  13. spring启动component-scan类扫描加载过程(转)
  14. Java学习NO.4
  15. [转]启动container的时候出现iptables: No chain/target/match by that name
  16. leetcode 704. Binary Search 、35. Search Insert Position 、278. First Bad Version
  17. Linux 网卡驱动学习(五)(收发包具体过程)【转】
  18. windows copy 和xcopy
  19. Booting dircetly into Redlink FW from flash
  20. Web开发框架趋势

热门文章

  1. Android 开发环境部署
  2. 七、latex中的插图
  3. 出现( linker command failed with exit code 1)错误总结(http://blog.csdn.net/hengshujiyi/article/details/21182813)
  4. STM32 总线
  5. 03python面向对象编程之Python中单下划线和双下划线的区别7
  6. “HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求”之解决办法
  7. .Net 网站配置文件 webconfig 配置。 字体图标+视频播放 以及 文件上传
  8. lua脚本入门
  9. luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra
  10. AC自动机及其模板