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ファイルで上記の関数をコールバックとして呼び出す必要があります。

DLLに対してDelphiで次の宣言を行いました。

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 では、呼び出し規約が指定されていない場合、レジスタ ベースの Delphi fastcall 規約registerが使用されます。それは確かに間違っています。

最後に、構造体へのポインターが決して存在しない場合は、パラメーター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 に答える