我有一个从(DLL)调用的回调函数(在c ++ exe app中定义)。 DLL中的声明(C ++ builder 2009):
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;
typedef void (__closure __fastcall *COTI_t_UsrRxIntHdlr)(UINT16 count, COTI_CAN_OBJ far * p_obj);
当我在DLL中调用此回调时,它执行正常,但在p_obj中传递的值不正确,它看起来取自不同的地方(地址)而不是传递。
有人可以帮忙吗?
这是在我的dll(客户端)中由c ++ app(host)调用的函数,并且作为参数传递回调函数的指针:
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 ++ app(host)中回调函数的声明:
static void CotiRxHandler(UINT16 count, COTI_CAN_OBJ *p_obj)
{
...
return;
}
答案 0 :(得分:0)
我认为与调用约定有关。你确定你用__fastcall调用它,因为默认调用约定是__stdcall for windows。
修改强>
可能存在数据对齐问题。尝试下面给出的解决方案:
添加
#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
到你的结构声明。
更新2:
更改:强>
static void CotiRxHandler(UINT16 count,COTI_CAN_OBJ * p_obj)
到
static void __fastcall CotiRxHandler(UINT16 count,COTI_CAN_OBJ * p_obj)
答案 1 :(得分:0)
除了@CasperGhost推荐的内容之外,我还建议您调试代码 - 特别是在DLL / EXE边界附近。查看调用函数时传递的内容(即COTI_CAN_OBJ
的局部变量的内容)。现在,仔细查看被调用函数中相同变量的内容 - 看看是否所有内容都匹配。您应该在数据类型(即sizeof
)上使用COTI_CAN_OBJ
来查看它是否与DLL和EXE(或DLL)中的相同。