1

(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;
}
4

2 に答える 2

0

@CasperGhost の推奨事項に加えて、コードをデバッグすることをお勧めします (特に DLL/EXE 境界付近)。関数を呼び出したときに何が渡されるかを確認します (つまり、 のローカル変数の内容COTI_CAN_OBJ)。ここで、呼び出された関数内の同じ変数の内容をよく見てください。すべてが一致するかどうかを確認してください。sizeofデータ型 (つまり) を使用してCOTI_CAN_OBJ、DLL と EXE (または DLL) で同じかどうかを確認する必要があります。

于 2013-03-10T12:54:30.593 に答える
0

呼び出し規約と関係があると思います。デフォルトの呼び出し規約は Windows の __stdcall であるため、__fastcall で呼び出していますか?

編集:

データの配置に問題がある可能性があります。以下の解決策を試してください。

追加

#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 カウント、COTI_CAN_OBJ *p_obj)

static void __fastcall CotiRxHandler(UINT16 カウント、COTI_CAN_OBJ *p_obj)

于 2013-03-07T16:38:29.883 に答える