"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;