Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Ansprechen einer C++ DLL von Delphi (https://www.delphipraxis.net/189949-ansprechen-einer-c-dll-von-delphi.html)

calibra301 11. Aug 2016 12:57

Delphi-Version: 5

Ansprechen einer C++ DLL von Delphi
 
Hallo,

hab eine C++ DLL mit folgendem Funktionsaufruf aus dem Header-File:

extern "C" DLLFunction void loadfile(int Target,const char* FileName);

In Delphi machte ich daraus:
function loadfile(Target:integer ;FileName:PAnsiChar):Boolean;stdcall;external 'Digilabs.dll';

Aufruf der Funktion:
Procedure File_Laden(Name:String);
Var FileName:PWideChar;
Begin
FileName:=PWideChar(Name);
loadfile(1,PAnsiChar(Name));
Beep;
end;

Kommt aber leider nie beim "Beep" an. Sobald er bei "loadfile" ist beendet sich das Programm...
Was mache ich falsch ?

Gruss
Calli

Neutral General 11. Aug 2016 13:00

AW: Ansprechen einer C++ DLL von Delphi
 
void ist eine procedure und keine Funktion mit Boolean Rückgabewert.
Bin mir nicht sicher was "DLLFunction" ist aber ggf. musst du stdcall durch cdecl ersetzen.

Edit: Und dein Cast eines Strings/PWidechars auf PAnsiChar wird auch in die Hose gehen.
Nimm direkt nen AnsiString oder du musst es richtig umwandeln.

Namenloser 11. Aug 2016 13:01

AW: Ansprechen einer C++ DLL von Delphi
 
Probier mal cdecl statt stdcall.

BUG 11. Aug 2016 13:05

AW: Ansprechen einer C++ DLL von Delphi
 
Bitte ergänze die Delphi-Tags um deinen Code.
Code:
[DELPHI]//...[/DELPHI]


Gut zu wissen: extern "C" stellt das C++-Name-Mangling aus und lässt das Ganze wie eine C-Funktion aussehen.

calibra301 12. Aug 2016 04:47

AW: Ansprechen einer C++ DLL von Delphi
 
Danke,

so funktionierts:

Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
function loadfile(Target:integer ;FileName:AnsiString):Boolean;cdecl;external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name:String);
Begin
 loadfile(1,AnsiString(Name));
 Beep;
end;
Danke !
Calli

uligerhardt 12. Aug 2016 07:02

AW: Ansprechen einer C++ DLL von Delphi
 
Zitat:

Zitat von calibra301 (Beitrag 1344678)
hab eine C++ DLL mit folgendem Funktionsaufruf aus dem Header-File:

extern "C" DLLFunction void loadfile(int Target,const char* FileName);

Zitat:

Zitat von calibra301 (Beitrag 1344733)
so funktionierts:

Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
function loadfile(Target:integer ;FileName:AnsiString):Boolean;cdecl;external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name:String);
Begin
 loadfile(1,AnsiString(Name));
 Beep;
end;

Wenn das funktioniert, dann nur mit viel Glück:
  • Du hast immer noch eine function, obwohl es eine procedure sein müsste.
  • FileName muss laut deiner C++-Deklaration ein PAnsiChar sein, definitiv kein Delphi-String.

EWeiss 12. Aug 2016 07:58

AW: Ansprechen einer C++ DLL von Delphi
 
Delphi-Quellcode:
procedure loadfile(Target: integer; FileName: PAnsiChar);cdecl; external 'Digilabs.dll';

// Aufruf der Funktion:
procedure File_Laden(FileName: PAnsiChar);
begin
  loadfile(1, FileName);
  Beep;
end;
Na dann..

gruss

himitsu 12. Aug 2016 10:37

AW: Ansprechen einer C++ DLL von Delphi
 
"Richtig"
Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
procedure loadfile(Target: Integer; FileName: PAnsiChar); cdecl; external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name: AnsiString);
Begin
 loadfile(1, PAnsiChar(Name));
 Beep;
end;
Das geht nur, weil AnsiString intern "auch" wie ein PAnsiChar aussieht. (nutze ich auch gern mal bei Header-Übersetzung, um die AutoCasts nutzen zu können)
Und es geht auch nur bei IN-Parametern, die keine Mindestlänge verlangen und nil/NULL sein dürfen.
Ebenso UnicodeString und WideString nach PWideChar und String nach PChar.
Diese Typen habem zwar eine Längenangabe, aber für die Kompatibilität auch zusätzlich noch ein abschließendes #0.
Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
procedure loadfile(Target: Integer; FileName: AnsiString); cdecl; external 'Digilabs.dll';

// Aufruf der Funktion:
Procedure File_Laden(Name: String);
Begin
 loadfile(1, Name); // mit Auto-Konvertierung
 loadfile(1, AnsiString(Name)); // mit explizitem Cast (das unterdrückt auch die Warnung ab Delphi 2009, wegen des Unicodes)
 Beep;
end;

uligerhardt 12. Aug 2016 10:40

AW: Ansprechen einer C++ DLL von Delphi
 
Zitat:

Zitat von himitsu (Beitrag 1344753)
Delphi-Quellcode:
// Deklaration des Aufrufes der C++ DLL mit const char* FileName
function loadfile(Target: Integer; FileName: AnsiString): Boolean; cdecl; external 'Digilabs.dll';

Procedure, procedure, procedure! :wall:

EWeiss 12. Aug 2016 10:41

AW: Ansprechen einer C++ DLL von Delphi
 
wie schon gesagt void ist keine Funktion. :wall:
Nebenbei "Richtig" kann auch "Falsch" sein.. LOL

gruss

DeddyH 12. Aug 2016 14:38

AW: Ansprechen einer C++ DLL von Delphi
 
Delphi-Quellcode:
function loadfile(Target: Integer; FileName: AnsiString): void; cdecl; external 'Digilabs.dll';
:lol: :duck:

himitsu 12. Aug 2016 22:17

AW: Ansprechen einer C++ DLL von Delphi
 
Der Witz ist, dass diese "Funktion" erstmal keinen Fehler verursacht, außer dass das Result einen Zufallswert enthält. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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