(DLL)から呼び出すコールバック関数(C++ exeアプリで定義)があります。DLL での宣言 (C++ ビルダー 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++ アプリ (ホスト) によって呼び出される関数であり、パラメーターとしてコールバック関数のポインターが渡されます。
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++ アプリ (ホスト) でのコールバック関数の宣言です。
static void CotiRxHandler(UINT16 count, COTI_CAN_OBJ *p_obj)
{
...
return;
}