AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi C++ DLL (Funktion) nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DLL (Funktion) nach Delphi

Ein Thema von AJ_Oldendorf · begonnen am 28. Mär 2018 · letzter Beitrag vom 20. Apr 2018
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#1

C++ DLL (Funktion) nach Delphi

  Alt 28. Mär 2018, 15:06
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.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: C++ DLL (Funktion) nach Delphi

  Alt 28. Mär 2018, 16:05
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;
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

AW: C++ DLL (Funktion) nach Delphi

  Alt 28. Mär 2018, 17:15
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Mär 2018 um 17:17 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: C++ DLL (Funktion) nach Delphi

  Alt 28. Mär 2018, 20:02
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 02:49
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

Geändert von EWeiss (29. Mär 2018 um 04:58 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 07:05
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.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 07:27
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 07:37
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

Geändert von EWeiss (29. Mär 2018 um 07:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 08:08
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: C++ DLL (Funktion) nach Delphi

  Alt 29. Mär 2018, 08:10
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
 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)
Fritz Westermann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 Uhr.
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