几个模拟OLE事件注册调用的宏

Posted eaglexmw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几个模拟OLE事件注册调用的宏相关的知识,希望对你有一定的参考价值。

最近遇到一个要求,将原来的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事件注册调用的宏的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口?

DLL能被几个进程同时调用吗?

我想在网页上单击某个按钮,调用本地的应用程序,如何实现最好?求高人指导!!!

java 安卓中performClick方法---代码调用点击事件(模拟去触摸控件)

ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

ThreadThreading.TimerTask中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”