2013-03-07 118 views
1

我有一個從(DLL)調用的回調函數(在C++ exe應用程序中定義)。 Declaraction在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傳遞的值是不正確的,它看起來是從比通過不同勢的地方(地址)拍攝。

任何人都可以幫忙嗎?

這是由C++程序(主機)在我的DLL(客戶端)調用的函數和作爲參數的指針回調函數傳遞:

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

然後在另一個函數I調用回調作爲:

... 
    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; 
} 
+2

你將不得不顯示一些真正的代碼恐怕 – 2013-03-07 12:09:00

回答

0

我認爲與調用約定有關。你確定用__fastcall調用它,因爲默認的調用約定是windows的__stdcall。

編輯:

可能有數據對齊問題。嘗試解決方案如下:

添加

#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 

你struct聲明。

更新2:

變化:

靜態無效CotiRxHandler(UINT16計數,COTI_CAN_OBJ * p_obj)

靜態無效__ FASTCALL CotiRxHandler(UINT16計數,COTI_CAN_OBJ * p_obj)

+0

如果我改變任何調用轉向,然後c + +應用程序掛起。 只有這樣的調用這個回調工作,但通過paarameters不是我通過。我認爲這是因爲: COTI_CAN_OBJ far * p_obj因爲在C++應用程序中,我只能看到在p_obj結構中傳遞的數據,但是這個傳遞的結構中的數據並不是我設置的。我認爲問題是關於指針地址的聲明,但我不知道是什麼。 – Jacek 2013-03-08 11:03:10

+0

@Jaek:提供來電顯示。 – CasperGhost 2013-03-09 04:52:40

+0

我添加了: #pragma pack(push,1)//添加 #pragma pack(pop)//添加 但它沒有幫助。 – Jacek 2013-03-10 10:33:35

0

除了什麼@CasperGhost建議,我會建議你調試代碼 - 尤其是周圍的DLL/EXE邊界。查看調用函數時傳遞的內容(即局部變量的內容爲COTI_CAN_OBJ)。現在,仔細查看被調用函數中相同變量的內容 - 查看是否所有內容都匹配。你應該在數據類型上使用sizeof(即COTI_CAN_OBJ)來查看它在DLL和EXE(或DLL)中是否相同。