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 Matlab问题解答有两个问题
  • ¥50 Oracle Kubernetes服务器集群主节点无法访问,工作节点可以访问
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架
  • ¥15 有关sql server business intellige安装,包括SSDT、SSMS。
  • ¥15 stm32的can接口不能收发数据
  • ¥15 目标检测算法移植到arm开发板
  • ¥15 利用JD51设计温度报警系统
  • ¥15 快手联盟怎么快速的跑出建立模型