jomoonrain2 2015-06-12 10:13 采纳率: 100%
浏览 2049
已采纳

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币,不吝赐教。

  • 写回答

3条回答 默认 最新

  • 知常曰明 2015-06-12 11:58
    关注

    在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)
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献