几个模拟OLE事件注册、调用的宏
最近遇到一个要求,将原来的OCX控件,替换成直接的DLL调用。
遇到OLE的事件回调,写了三个宏,用于简化代码
#define OLE_ENVENT_IN_CLASS_ONE(event_name, func_ret_type, param_type , param_name) \ public: \
typedefstructevent_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)
事件调用处如此执行
voidcwDetectCallback(LPCTSTR content)
{
#ifndef CW_LIB_DEF
FireEvent(eventidcwDetectCallback, EVENT_PARAM(VTS_BSTR), content);#elseCALL_OLE_EVENT(EventCallback, content);#endif}
调用处,原OLE控件初始化处,如下设置
auto ret = activex_.cwInitControl(_T(""));//模拟事件调用 SET_OLE_EVENT_TO_OBJ(CStrCloudWalkControlCtrl, EventCallback, &activex_, this, CCloudWalkLiveDetectDlg::OnLiveDetectCallbackFunc, LPCTSTR, content);
回调函数正常定义。