最近寫了個項目,裡面遇到了一個函數跨模塊回調的問題,由於項目本身比較復雜,所以簡化了一下,但是還是能反映問題的。
問題大致是這樣:
我從主程序(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)
運行可以通過,但是不知道是不是符合你的要求。