![]() |
C++ DLL (Funktion) nach Delphi
Hallo,
ich habe eine Frage zu folgender Deklaration einer Funktion in einer C++ DLL, welche ich ansprechen muss:
Delphi-Quellcode:
Im Delphi würde ich die dann wie folgt deklarieren:
typedef char My_STRING;
Res_DWORD Get_Error_Text ( ERROR_T *error, // in const My_STRING *language, // in My_STRING text[1024] ); // out
Delphi-Quellcode:
Aufruf dann so:
type
PERROR = ^TERROR; TERROR = packed Record Long1 : LongWord; Long2 : LongWord; Byte1 : BYTE; Byte2 : BYTE; Byte3 : BYTE; end; function Get_Error_Text(aError: PERROR; aLanguage: String; out aErrStr: String): LongWord;stdcall;external 'ExterneDLL.dll';
Delphi-Quellcode:
Mein Problem ist, dass in der Errorstruktur ein Fehler ansteigt aber mit meinem Aufruf bekomme ich immer in "ErrStr" nur ein LeerString geliefert. Könnt ihr mir sagen, wo das Problem besteht? ich vermute ein Fehler mit dem Datentyp String, dem Char und dem beschreiben des Parameters "ErrStr" beim Aufruf der DLL.
procedure TForm1.Button1Click(Sender: TObject);
Const ErrLanguage = 'English'; var ErrClass : LongWord; ErrStruct : TERROR; ErrStr : String; begin ErrClass := Get_Error_Text(@ErrStruct, ErrLanguage, ErrStr); ShowMessage(ErrStr); end; |
AW: C++ DLL (Funktion) nach Delphi
Versuch es mal so: (ungertestet)
Delphi-Quellcode:
type
TERROR = packed Record Long1 : LongWord; Long2 : LongWord; Byte1 : BYTE; Byte2 : BYTE; Byte3 : BYTE; end; type ErrorStr = Array[0..1024-1] of AnsiChar; function Get_Error_Text(var aError: TERROR; aLanguage: PAnsiChar; var aErrStr: ErrorStr): LongWord;stdcall;external 'ExterneDLL.dll'; procedure Button1Click; Const ErrLanguage : AnsiString = 'English'; var ErrClass : LongWord; ErrStruct : TERROR; ErrStr : ErrorStr; myErrorstring : String; begin ErrClass := Get_Error_Text(ErrStruct, PansiChar(ErrLanguage), ErrStr); myErrorstring := String(AnsiString(ErrStr)); ShowMessage( myErrorstring); end; |
AW: C++ DLL (Funktion) nach Delphi
Gemanagte Typen ala String, Interfaces oder dynamische Arrays besser niemals als OUT-Parameter deklatieren, sondern nur als VAR.
Und dann ist dieses C++-Char-Array kein Delphi-String, weswegen dein Code nicht funktionieren kann, wenn du inkompatible Typen auf beiden Seiten (DLL und EXE) hast. Wenn das aber deine DLL ist und du unbedingt "Strings" haben willst, dann nimm in Delphi den WideString, denn dieser Typ kapelst den BSTR der OleAuth32.dll, welche du auch im C++ nutzen kannst. ![]() Außerdem, wenn du gemaagte Typen ala String über Modulgrenzen (EXE/DLL) hinweg nutzen willst, dann muß du auch den Speichermanager vom Delphi überall gemeinsam nutzen. ![]() ![]() |
AW: C++ DLL (Funktion) nach Delphi
Die DLL ist leider nicht von mir, deswegen kann ich da nichts ändern. Ich werde den Code von Fritzew morgen mal probieren.
@Himitsu: wie müsste ich es denn auf der Delphi Seite deklarieren, damit es funktioniert? Ich habe leider nur eine Doku in Form einer PDF. |
AW: C++ DLL (Funktion) nach Delphi
Ich möchte bezweifeln das die Struct unter C++ mit 1 Byte alignment definiert wurde.
Was soll also dieses packed Record? gibt es so etwas wie.. in dem C++ code?
Code:
denke nicht.
#pragma pack(push, 1)
Wenn also die Ausrichtung der struct (record) schon nicht stimmt wie soll das andere dann funktionieren. gruss |
AW: C++ DLL (Funktion) nach Delphi
Die Struktur ist so deklariert:
Delphi-Quellcode:
Ich glaube daher schon, dass meine packed record Struktur richtig ist, es steht ja auch ein sinnvoller Wert in die beiden Long-Variablen.
typedef unsigned char My_BYTE;
typedef unsigned long My_DWORD; typedef struct My_ERROR { My_DWORD Long1; My_DWORD Long2; My_BYTE Byte1; My_BYTE Byte2; My_BYTE Byte3; } PPC_BYTE_PACKED My_ERROR_T; |
AW: C++ DLL (Funktion) nach Delphi
Mit der Variante von Fritzew steht schonmal was in dem ErrStr drinne.
Leider sind nicht alle 1024 Zeichen sinnvoll gefüllt, aber ca. 200 steht nur noch "Mist" drin. Wenn ich jetzt die Umwandlung auf ein String mache, bekomme ich eine Zugriffsverletzung (Exception). Man müsste jetzt bestimmt die Länge noch herausbekommen, da nicht immer alle 1024 Zeichen gefüllt sind. |
AW: C++ DLL (Funktion) nach Delphi
Zitat:
Aber gut bin raus ;) ![]() gruss |
AW: C++ DLL (Funktion) nach Delphi
Zitat:
Alternativ kannst du auch den Text vor der Übergabe an die Funktion mit FillChar nullen. Das wird wahrscheinlich auch funktionieren. |
AW: C++ DLL (Funktion) nach Delphi
Zitat:
Delphi-Quellcode:
ein.
fillchar(ErrStr, Sizeof(ErrStr), 0);
Der Einwurf von EWeis ist schon richtig. aber ohne header file ist es schwer zu sagen. (Trotz roter Box abgeschickt) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz