回调c delphi 这是C++应用程序(EXE主机)中定义的过程。

回调c delphi 这是C++应用程序(EXE主机)中定义的过程。,c++,delphi,dll,callback,C++,Delphi,Dll,Callback,我需要在用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_DA

我需要在用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;
在另一个过程中,我得到了主机中RX_数据过程的指针。 现在我在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;
回调被称为correct,但传入RX_data_out变量的数据不正确,看起来指向RX_data_out变量的指针没有指向该变量


可以说什么是错的?< /P> < P> C++函数类型是一个简单函数,即不是一个成员函数。但是您已经声明您的版本是object的方法。这是不匹配的。您必须删除对象的

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

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

RX_DATA = procedure(count:UINT16; var RX_DATA_OBJ: TRX_DATA_OBJ); cdecl;
显然,您必须更改调用代码以匹配:

RX_DATA(1, RX_DATA_out);

C++函数类型是一个简单函数,即不是成员函数。但是您已经声明您的版本是object的方法。这是不匹配的。您必须删除对象的

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

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

RX_DATA = procedure(count:UINT16; var RX_DATA_OBJ: TRX_DATA_OBJ); cdecl;
显然,您必须更改调用代码以匹配:

RX_DATA(1, RX_DATA_out);

当我使用cdecl时;它挂在C++主机应用程序上,当我把var当作你建议的,我不能编译我的代码时,我在RXXX数据中有错误(1,@ RXYDATAOUTUE);你当然知道。您自然也必须更改调用代码!卸下
@
。至于调用约定,需要找出C++代码所期望的调用约定。并在您的Delphi代码中使用它。它仍然不起作用,主机处于挂起状态。当对象是C++时,它只调用CONTICE调用,但数据不正确:(您是如何发现调用约定的?)当我使用CDECL时,它挂在C++主机应用程序上。当我把VAR放在您的建议中时,我不能编译我的代码,RXXX数据(1,@ RXYDATAOXOUT)中有错误。当然,你也必须改变调用代码。删除“代码”>代码>,对于调用约定,你需要找出C++代码中调用什么约定。在Delphi代码中使用它。它仍然不起作用,主机是挂起的。当对象是但不正确时,只调用CONTICE调用:(您是如何找到要使用的呼叫约定的?