在回调中传递数据 我有一个调用函数(在C++ exe应用程序中定义),它是从DLL调用的。 DLL中的声明(C++builder 2009):

在回调中传递数据 我有一个调用函数(在C++ exe应用程序中定义),它是从DLL调用的。 DLL中的声明(C++builder 2009):,c++,dll,callback,C++,Dll,Callback,当我在DLL中调用此回调时,它执行正常,但在p_obj中传递的值不正确。看起来是从不同的位置(地址)获取的,而不是传递的 有人能帮忙吗 这是我的DLL(客户端)中C++调用的函数,作为参数,回调函数的指针通过: COTI_t_UsrRxIntHdlr local_int_hdlr; COTI_CAN_OBJ obj; extern "C" __declspec(dllexport) __cdecl UINT32 COTI_InitBoard( UINT16 board_seg,

当我在DLL中调用此回调时,它执行正常,但在p_obj中传递的值不正确。看起来是从不同的位置(地址)获取的,而不是传递的

有人能帮忙吗

这是我的DLL(客户端)中C++调用的函数,作为参数,回调函数的指针通过:

COTI_t_UsrRxIntHdlr local_int_hdlr;
COTI_CAN_OBJ obj;

extern "C" __declspec(dllexport) __cdecl UINT32 COTI_InitBoard(
    UINT16 board_seg,
    COTI_t_UsrRxIntHdlr fp_int_hdlr,
    COTI_t_UsrExcHdlr fp_exc_hdlr
    )
    {
     local_int_hdlr = fp_int_hdlr;
     local_exc_hdlr = fp_exc_hdlr;

     fp_int_hdlr(0,NULL);

     return 1;
    }
然后在另一个函数中,我将回调调用为:

...
     obj.id=0x701;
     obj.len=5;
     obj.a_data[0]=10;
     obj.a_data[1]=20;
     obj.a_data[2]=30;
     obj.a_data[3]=40;
     obj.a_data[4]=50;
 local_int_hdlr(1, &obj);
    ...

这是C++应用程序(主机)中回调函数的声明:


我想这和电话会议有关。您确定要使用u fastcall调用它,因为默认调用约定是u stdcall for windows

编辑:

可能存在数据对齐问题。尝试下面给出的解决方案:

到您的结构声明

更新2:

更改:

静态无效协同处理(UINT16计数,COTI_CAN_OBJ*p_OBJ)

静态无效快速呼叫CotiRxHandler(UINT16计数,COTI\u CAN\u OBJ*p\u OBJ)


除了@CasperGhost建议的之外,我还建议您调试代码,尤其是在DLL/EXE边界附近。查看调用函数时传递的内容(即
COTI\u CAN\u OBJ
的局部变量的内容)。现在,仔细查看被调用函数中同一变量的内容,看看是否所有内容都匹配。你应该在数据类型上使用<代码> siZoof (即<代码> COTIAYCANOBJ ),以查看它在DLL和EXE(或DLL)中是否相同。

你必须显示一些真实代码,我在调用Cuffic中更改任何内容,然后使用C++应用程序挂起。只有这样的调用这个回调才有效,但传递的参数不是我传递的参数。我认为有一些东西是:CythiCuNoObFix*PoObv,因为在C++应用程序中,我只能看到在pObjb结构中传递的数据,但是这个经过的结构中的数据不是我所设置的。我认为问题在于指针地址的声明,但我不知道是什么。我添加了:#pragma pack(push,1)//Add#pragma pack(pop)//Add,但它没有帮助。
...
     obj.id=0x701;
     obj.len=5;
     obj.a_data[0]=10;
     obj.a_data[1]=20;
     obj.a_data[2]=30;
     obj.a_data[3]=40;
     obj.a_data[4]=50;
 local_int_hdlr(1, &obj);
    ...
static void CotiRxHandler(UINT16 count, COTI_CAN_OBJ *p_obj)
{
   ...
   return;
}
#pragma pack(push,1) //Add

typedef struct{
INT32      time_stamp;      
INT32      id;              
INT8       len:4;           
INT8       rtr:1;       
INT8       res:3;           
INT8       a_data[8];      
INT8       sts;            
} COTI_CAN_OBJ;

#pragma pack(pop) //Add