在回调中传递数据 我有一个调用函数(在C++ exe应用程序中定义),它是从DLL调用的。 DLL中的声明(C++builder 2009):
当我在DLL中调用此回调时,它执行正常,但在p_obj中传递的值不正确。看起来是从不同的位置(地址)获取的,而不是传递的 有人能帮忙吗在回调中传递数据 我有一个调用函数(在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(客户端)中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