zoukankan      html  css  js  c++  java
  • 几个模拟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);

    回调函数正常定义。

  • 相关阅读:
    利用JNI技术在Android中调用、调试C++代码
    iOS在线更新framework,使用NSBundle动态读取
    CocoaPods pod install
    Quartz 2D在ios中的使用简述二:创建画布
    iOS并发编程笔记【转】
    openCV C++ 代码笔记
    Quartz 2D在ios中的使用简述一:坐标体系
    ios视频播放器,代码和界面分离
    mac显示和隐藏文件
    3点画圆
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11124787.html
Copyright © 2011-2022 走看看