Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Delphi DLL String übergeben (https://www.delphipraxis.net/214868-delphi-dll-string-uebergeben.html)

DelTurbo 25. Mär 2024 13:31

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.

Papaschlumpf73 25. Mär 2024 13:40

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.

DelTurbo 25. Mär 2024 13:42

AW: Delphi DLL String übergeben
 
Und da kann man gar nichts machen?

Papaschlumpf73 25. Mär 2024 13:43

AW: Delphi DLL String übergeben
 
Du könntest ggf. einen PWideChar statt PChar übergeben; das könnte vielleicht klappen.

Rolf Frei 25. Mär 2024 13:48

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:
var
  s: WideString;
begin
  s := 'mein key';
  ConnectApi(PWideChar(s));
end;
oder so:
Delphi-Quellcode:
var
  s: String;
begin
  s := 'mein key';
  ConnectApi(PWideChar(WideString(s)));
end;

DelTurbo 25. Mär 2024 13:53

AW: Delphi DLL String übergeben
 
Könnte ich auch PAnsiString nehmen? Weil ich ja einen langen String übergeben muss.

Das hat sich überschnitten... Sorry

DelTurbo 25. Mär 2024 14:01

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.

Rolf Frei 25. Mär 2024 14:07

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:
function ConnectApi(Key:PChar):Boolean; cdecl;
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:
Delphi-Quellcode:
{$IFDEF UNICODE}  // D2009+
function ConnectApi(Key:PChar):Boolean; cdecl
{$ELSE}  // D2007
function ConnectApi(Key:PWideChar):Boolean; cdecl
{$ENDIF}

Zitat:

Könnte ich auch PAnsiString nehmen? Weil ich ja einen langen String übergeben muss.
Das versthe ich nicht so ganz, was du damit meinst? Die länge des String ist im Prinzip egal. PAnsiString würde ich auf keinen Fall nehmen, weil String in D2007 nicht einem String in D10.4 entspricht und das inkompatibel ist.

Rolf Frei 25. Mär 2024 14:08

AW: Delphi DLL String übergeben
 
Zitat:

Zitat von DelTurbo (Beitrag 1534985)
Das geht. Ich brech ab. WideChar/String ist doch länger als 255, oder? Ich meine der wäre 0 Terminiert.

Nur der Datentyp ShotString besteht aus maximal 255 Zeichen, alles andere ist unlimitiert.

DelTurbo 25. Mär 2024 14:11

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 12:47 Uhr.
Seite 1 von 3  1 23      

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