程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c++ 回調函數-c++通過成員函數指針 跨DLL回調的問題

c++ 回調函數-c++通過成員函數指針 跨DLL回調的問題

編輯:編程綜合問答
c++通過成員函數指針 跨DLL回調的問題

最近寫了個項目,裡面遇到了一個函數跨模塊回調的問題,由於項目本身比較復雜,所以簡化了一下,但是還是能反映問題的。

問題大致是這樣:
我從主程序(exe)中調用一個DLL(稱為D)中的類,這個類又調用另一個DLL(稱為B)中的類,在每一級的調用之前都已經傳入了一個函數指針, 在B執行完之後通過回調返回到上一個DLL(D),然後再通過回調最後返回到主程序。但是在從B返回到D之後,D的數據好像變了,導致D最終無法返回主程序。

更具體一點:
D是依賴於B的,而主程序對B和D都依賴。
回調我是通過類的成員函數指針:

typedef void(Object::*CallBack)(...);

通過一個結構體來保存函數指針和該函數所屬的對象。

typedef struct 
{
    Object* object;
    CallBack method;
} EventHandler;

代碼片段在這裡:
https://code.csdn.net/snippets/693435
項目地址:
https://code.csdn.net/jomoonrain2/c-lab

我覺得最有問題是我定義的這個函數指針。
但是問題是如果我沒有跨DLL的話,貌似這樣是沒問題的。我知道跨模塊調用應該挺復雜,雖然可以想其他的辦法,但是這個問題如果搞不明白,吃飯都不香。。。

希望各路高手不嫌棄我這僅有的60幣,不吝賜教。

最佳回答:


在Object.h,你定義的Callback是,不限制參數個數

typedef void(Object::*CallBack)(...);

但是在實際調用的時候,你給的函數是App::onCall.App::inCall 的定義是

 void App::onCall(Derive* d)

因此這裡是有矛盾的。傳遞的函數指針的結構不一樣。
因此我把Object.h裡面的CallBack定義改為:

 typedef void(Object::*CallBack)(void *p);

並且隨後的兩個宏業修改了

 #define EV_CB(_obj,_func) EventHandler{_obj,(CallBack)&_func}
#define EV_INVOKE(_cb,p) do{ \
        if(_cb.object && _cb.method) {\
            (_cb.object->*_cb.method)(p);\
                            }\
    }while(0)

運行可以通過,但是不知道是不是符合你的要求。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved