![]() |
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 |
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. |
AW: Ansprechen einer C++ DLL von Delphi
Probier mal cdecl statt stdcall.
|
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. |
AW: Ansprechen einer C++ DLL von Delphi
Danke,
so funktionierts:
Delphi-Quellcode:
Danke !
// 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; Calli |
AW: Ansprechen einer C++ DLL von Delphi
Zitat:
Zitat:
|
AW: Ansprechen einer C++ DLL von Delphi
Delphi-Quellcode:
Na dann..
procedure loadfile(Target: integer; FileName: PAnsiChar);cdecl; external 'Digilabs.dll';
// Aufruf der Funktion: procedure File_Laden(FileName: PAnsiChar); begin loadfile(1, FileName); Beep; end; gruss |
AW: Ansprechen einer C++ DLL von Delphi
"Richtig"
Delphi-Quellcode:
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)
// 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; 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; |
AW: Ansprechen einer C++ DLL von Delphi
Zitat:
|
AW: Ansprechen einer C++ DLL von Delphi
wie schon gesagt void ist keine Funktion. :wall:
Nebenbei "Richtig" kann auch "Falsch" sein.. LOL gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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-2025 by Thomas Breitkreuz