Einzelnen Beitrag anzeigen

Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#1

Delphi-DLL in C++ Programm benutzen

  Alt 20. Jun 2013, 15:04
Moin moin,

ich muss eine (Delphi-)DLL in ein C++ Programm einbinden. Die Datentypen der (Delphi-)DLL und die beiden Funktionen sind wie folgt deklariert:
Delphi-Quellcode:
type
   TBlock = Array[0..15] of Byte;
   TNumber = Array[0..3] of Byte;
   TPosition = $00..$0F;
   TData = packed Record
      arrBlock0 : TBlock;
      arrBlock1 : TBlock;
      arrBlock2 : TBlock;
      arrBlock3 : TBlock;
   end;
   TResultData = packed Record
      intErrorCode : Integer;
      arrID : TNumber;
      Data : TData;
   end;

   function GetData(const PaArrID: TNumber; const PaPosition: TPosition): TResultData; stdcall;
   function CheckData(const PaArrID: TNumber; const PaData: TData; PaPosition: TPosition): Boolean; stdcall;
Folgendes habe ich in C++ umgesetzt:
Code:
typedef unsigned char TBlock[16];
typedef unsigned char TNumber[4];
typedef unsigned char BYTE;
typedef struct {
  TBlock arrBlock0;
  TBlock arrBlock1;
  TBlock arrBlock2;
  TBlock arrBlock3;
} TData;
typedef struct {
  int intErrorCode;
  TNumber arrID;
  TData Data;
} TResultData;

typedef TResultData (__stdcall *pGetData)(const TNumber PaArrID, BYTE PaPosition);

// ...

pGetData GetData = (pGetData)GetProcAddress(hInst,"GetData");
Der Funktionszeiger wird zugewiesen und ich kann die Funktion auch verwenden.

Das Problem ist nun aber, dass dort irgendetwas nicht passt - ich kann es kontrollieren, da die DLL das übergebene Array (TNumber) auch in TResultData unverändert zurückliefert. Also wenn ich folgendes mache:
Code:
      id[0] = 0x10;
      id[1] = 0x20;
      id[2] = 0x30;
      id[3] = 0x40;

      res = GetData(id, position);
      printf("%#x", res.arrID[0]); // Hier sollte jetzt eigentlich 0x10 angezeigt werden... leider ist der wert immer anders?!
dann muss in arrID[0] der gleiche Wert stehen wie in id[0]. Leider stehen da nach jedem Aufruf andere Werte. Ich vermute hier eine falsche "Übersetzung" der Delphi-Typen?!

Kann mir jemand sagen, was ich hier falsch gemacht habe?!
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat