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?!