1

这是在 C++ 应用程序 (exe HOST) 中定义的过程。

typedef struct _ RX_DATA_OBJ {
   UINT32     TIME;        
   UINT32     ID;    
   UINT8      LEN; 
   UINT8      DATA[8]; 
} RX_DATA_OBJ;

static void RX_DATA(UINT16 CNT, RX_DATA_OBJ *p_RX_DTATA_OBJ)

我需要在用 Delphi 编写的 DLL 文件中调用上述函数作为回调。

我在 Delphi 中为我的 DLL 做了以下声明:

type
  TRX_DATA_OBJ = record
    time: UINT32;
    id:   UINT32;
    len:  UINT8;
    data: array [0..7] of UINT8;
  end;
  PRX_DATA_OBJ = ^TRX_DATA_OBJ;

RX_DATA = procedure(count:UINT16; RX_DATA_OBJ: PRX_DATA_OBJ ) of object;

var
  RX_DATA_out: TRX_DATA_OBJ;

在另一个过程中,我得到指向 HOST 中 RX_DATA 过程的指针。现在我在我的 DLL 中调用这个回调

procedure PUT_DATA;
begin
  RX_DATA_out.Time := 100;
  RX_DATA_out.id := $500;
  RX_DATA_out.len := 4;
  RX_DATA_out.data[0] := 1;
  RX_DATA_out.data[1] := 2;
  RX_DATA_out.data[2] := 3
  RX_DATA_out.data[3] := 4;
  RX_DATA_out.data[4] := 5;
  RX_DATA_out.data[5] := 6;
  RX_DATA_out.data[6] := 7;
  RX_DATA_out.data[7] := 8;

  RX_DATA(1, @RX_DATA_out); // RX_DATA_out is global variable defined.
end;

回调被称为正确但在 RX_DATA_out 变量中传递的数据不正确,看起来指向 RX_DATA_out 变量的指针没有指向该变量。

有人能说有什么问题吗?

4

1 回答 1

4

C++ 函数类型是普通函数,即不是成员函数。但是您已将您的版本声明为对象的方法。那是不匹配。您必须删除of object.

您还必须指定调用约定。很可能是这样cdecl。在 Delphi 中,如果未指定调用约定,则register使用基于寄存器的 Delphi fastcall 约定。那肯定是错的。

最后,如果指向结构的指针永远不会存在nil,那么使用var参数会更惯用:

RX_DATA = procedure(count:UINT16; var RX_DATA_OBJ: TRX_DATA_OBJ); cdecl;

显然,您必须更改调用代码以匹配:

RX_DATA(1, RX_DATA_out);
于 2013-02-12T14:33:59.740 回答