Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi C++ DLL (Funktion) nach Delphi (https://www.delphipraxis.net/195815-c-dll-funktion-nach-delphi.html)

AJ_Oldendorf 28. Mär 2018 15:06

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:
typedef char My_STRING;

Res_DWORD Get_Error_Text ( 
    ERROR_T   *error,       // in
    const My_STRING *language, // in
    My_STRING   text[1024] ); // out
Im Delphi würde ich die dann wie folgt deklarieren:

Delphi-Quellcode:
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';
Aufruf dann so:
Delphi-Quellcode:
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;
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.

Fritzew 28. Mär 2018 16:05

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;

himitsu 28. Mär 2018 17:15

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.
MSDN-Library durchsuchenSysAllocStringLen usw.

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.
Delphi-Referenz durchsuchenShareMem, Delphi-Referenz durchsuchenSimpleShareMem und Dergleichen

AJ_Oldendorf 28. Mär 2018 20:02

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.

EWeiss 29. Mär 2018 02:49

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:
#pragma pack(push, 1)
denke nicht.
Wenn also die Ausrichtung der struct (record) schon nicht stimmt wie soll das andere dann funktionieren.

gruss

AJ_Oldendorf 29. Mär 2018 07:05

AW: C++ DLL (Funktion) nach Delphi
 
Die Struktur ist so deklariert:

Delphi-Quellcode:
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;
Ich glaube daher schon, dass meine packed record Struktur richtig ist, es steht ja auch ein sinnvoller Wert in die beiden Long-Variablen.

AJ_Oldendorf 29. Mär 2018 07:27

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.

EWeiss 29. Mär 2018 07:37

AW: C++ DLL (Funktion) nach Delphi
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1397505)
Die Struktur ist so deklariert:

Delphi-Quellcode:
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;
Ich glaube daher schon, dass meine packed record Struktur richtig ist, es steht ja auch ein sinnvoller Wert in die beiden Long-Variablen.

Nun das war aber vorher aus deinem Code nicht ersichtlich von daher fand ich es legitim dich darauf hinzuweisen.
Aber gut bin raus ;)
Aber noch ein link.

gruss

Neutral General 29. Mär 2018 08:08

AW: C++ DLL (Funktion) nach Delphi
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1397506)
Man müsste jetzt bestimmt die Länge noch herausbekommen, da nicht immer alle 1024 Zeichen gefüllt sind.

Ich tippe mal auf den Rückgabewert der Funktion. Da steht wahrscheinlich die Länge des zurückgegebenen Strings drin.
Alternativ kannst du auch den Text vor der Übergabe an die Funktion mit FillChar nullen. Das wird wahrscheinlich auch funktionieren.

Fritzew 29. Mär 2018 08:10

AW: C++ DLL (Funktion) nach Delphi
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1397506)
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.

Dann füge doch bitte vor dem Aufruf einfach ein
Delphi-Quellcode:
 fillchar(ErrStr, Sizeof(ErrStr), 0);
ein.

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 21:14 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz