![]() |
Delphi DLL String übergeben
Hi,
ich habe folgendes Problem. Ein bekannter hat mir unter Delphi 10.4 eine DLL übersetzt weil es nicht unter Delphi 2007 ging. Er hat auch ein kleines Test Programm gemacht damit ich sehe das alles läuft. Nun komme ich mit meinem Delphi 2007 daher. Die DLL laden usw. klappt alles. Nun versuche ich seit Samstag einen String zu übergeben. In der DLL ist die function so hinterlegt.
Delphi-Quellcode:
function ConnectApi(Key:PChar):Boolean; cdecl;
Egal wie ich es übergebe in der DLL kommt nur "Müll" an. Nicht der String. Wie gehe ich nun am besten vor? Ich habe auch per TV zugriff auf sein Delphi und könnte die Functions Parameter ändern. Was ich auch schon gemacht habe. Aber es passt nix. In 20 Stunden kann man viele (auch blöde) Sachen probieren. Aber ich bekomme es nicht hin. Ich hoffe es weiß jemand ob das überhaupt geht, also DLL mit 10.4 und Programm mir 2007. Und wenn ja, wie? Vielen Dank im voraus PS.: Nehme ich mein Testprogramm (in Delphi 2007 geschrieben) und übersetze es mit 10.4 dann läuft immer alles. Egal wie Doof/unlogisch die Parameter sind. |
AW: Delphi DLL String übergeben
In Delphi 2007 war PChar noch nicht Unicode. In Delphi 10.4. jedoch schon. Liegt wahrscheinlich daran... Besser wäre wohl, ihr würdet einen WideString-Parameter benutzen; der ist in allen Versionen gleich.
|
AW: Delphi DLL String übergeben
Und da kann man gar nichts machen?
|
AW: Delphi DLL String übergeben
Du könntest ggf. einen PWideChar statt PChar übergeben; das könnte vielleicht klappen.
|
AW: Delphi DLL String übergeben
Das Problem wird sein, dass D2007 (ANSI) und D10.4 (Unicode) nicht die gleiche Definition von PChar haben. Früher zeigte ein PChar auf ein Byte (Zeichen) und seit D2009 auf 2 Bytes = 1 Zeichen. Du musst deshalb sicherstellen, dass beide Delphis die Daten auf die gleiche Weise verarbeiten, also Ansi oder Unicode.
Deklariere mal in D10.4 die DLL Funktion so: function ConnectApi(Key: PAnsiChar):Boolean; cdecl; Die Routine in 10.4 muss dann den String entsrechend verarbeiten und als AnsiString übergeben. Wenn du das umgekehrte machen willst, muss du in D2007 einen WideString als PWideChar übergeben. Das müsste auch gehen. Die Deklaration in D2007 müsste dann so sein: function ConnectApi(Key: PWideChar):Boolean; cdecl; Beispiel D2007:
Delphi-Quellcode:
oder so:
var
s: WideString; begin s := 'mein key'; ConnectApi(PWideChar(s)); end;
Delphi-Quellcode:
var
s: String; begin s := 'mein key'; ConnectApi(PWideChar(WideString(s))); end; |
AW: Delphi DLL String übergeben
Könnte ich auch PAnsiString nehmen? Weil ich ja einen langen String übergeben muss.
Das hat sich überschnitten... Sorry |
AW: Delphi DLL String übergeben
Das geht. Ich brech ab. WideChar/String ist doch länger als 255, oder? Ich meine der wäre 0 Terminiert.
|
AW: Delphi DLL String übergeben
Zuerst müssen wir wissen, wie es denn nun genau gemacht wird. Bleibt die Deklaration in D1.04 so mit PChar?
Delphi-Quellcode:
Wenn dem so ist, kannst du es so machen wie in meinem vorherigen Beispiel. Du benötigst für D2007 eine andere Deklaration als in D10.4:
function ConnectApi(Key:PChar):Boolean; cdecl;
Delphi-Quellcode:
{$IFDEF UNICODE} // D2009+
function ConnectApi(Key:PChar):Boolean; cdecl {$ELSE} // D2007 function ConnectApi(Key:PWideChar):Boolean; cdecl {$ENDIF} Zitat:
|
AW: Delphi DLL String übergeben
Zitat:
|
AW: Delphi DLL String übergeben
Hi,
erstmal danke für deine Hilfe. Ich habe die DLL schon geändert in function ConnectApi(Key : PWideChar):Boolean; cdecl; Klappt einwandfrei. Das mit dem Ansi vergiss wieder. Wenn man soooo lange dran sitzt und keinen erfolg hat, dann kommen auch komische Fragen... :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 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