Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String im record nach DLL (https://www.delphipraxis.net/201037-string-im-record-nach-dll.html)

Edelfix 18. Jun 2019 07:27

String im record nach DLL
 
Hallo,

ich überlege wie ich ein String in einem record nach DLL übergeben kann.
Bis jetzt habe ich einfach ein shortstring verwendet.
also:
Delphi-Quellcode:
type
  MyRecord =
    test: shortstring;
   ...
  end;
procedure SomeAPI(... var Rec: MyRecord; ...); //geht nach DLL
würde es auch so gehen:
Delphi-Quellcode:
type
  PMyRecord = ^MyRecord;
  MyRecord =
    test: String;
    ...
  end;
procedure SomeAPI(... Rec: PMyRecord; ...); //geht nach DLL
Bei shortstring ist die Länge klar. Bei String ist die Länge dynamisch. Könnte ein Problem sein?

Schokohase 18. Jun 2019 07:33

AW: String im record nach DLL
 
Ein
Delphi-Quellcode:
string
ist ein Referenz-Typ. Im record steht also nur ein Referenz-Zeiger und der bringt dir in diesem Fall nichts.

hoika 18. Jun 2019 07:33

AW: String im record nach DLL
 
Hallo,
die DLL ist von dir selbst?

Ich wäre aber pragmatisch:
Was funktioniert, würde ich nicht ändern.

Falls du wirklich Strings benutzen willst, nimm WideString oder UnicodeString (ausprobieren).
Da übernimmt Windows die Referenzzählung.

Edelfix 18. Jun 2019 08:08

AW: String im record nach DLL
 
Die DLL ist miene und nur meine. Die Frage kommt weil ich eventuell mit der Länge von shortstring nicht hin komme.

hoika 18. Jun 2019 08:24

AW: String im record nach DLL
 
Hallo,
dann probier aus, welcher meiner beiden gesagten Stringtypen bei dir funktioniert.

dummzeuch 18. Jun 2019 08:55

AW: String im record nach DLL
 
Zitat:

Zitat von Schokohase (Beitrag 1434891)
Ein
Delphi-Quellcode:
string
ist ein Referenz-Typ. Im record steht also nur ein Referenz-Zeiger und der bringt dir in diesem Fall nichts.

Das stimmt so nicht: Dieser Zeiger ist innerhalb der DLL immernoch gültig und zeigt auf den String-Descriptor (oder ist NIL, für einen leeren String).

Problematisch wird es erst, wenn man in der DLL darauf zugreift, denn dann kommt das Reference-Counting und die Speicherverwaltung ins Spiel und es wird hakelig. Aber auch hier sollte es noch nicht problematisch sein, lesend auf den String zuzugreifen und mittels UniqueString eine nur für die DLL zu verwendende Kopie zu erzeugen.

Solange auf beiden Seiten dieselbe Delphi-Version im Einsatz ist, kann man mit ShareMem arbeiten und diese Probleme verschwinden. Bei unterschiedlichen Delphi-Versionen wird es komplizierter, da nicht alle Sharemem-Implementationen kompatibel sind. Seit Delphi 2007 wird aber FastMM verwendet, d.h. bis dahin sollte auch das kein Problem sein.

Ab Delphi 2009 ist String ein UnicodeString, darauf muss man achten, wenn unterschiedliche Delphi-Versionen im Einsatz hat. Am Besten verwendet man einen eindeutigen Stringtyp: AnsiString oder UnicodeString statt String, damit das klar definiert ist.

Ist man nicht sicher, dass auf beiden Seiten immer Delphi zum Einsatz kommt, sollte man auf die Übergabe von Strings verzichten sondern lieber PChar / PAnsiChar / PWideChar oder den von hoika erwähnten WideString verwenden (welcher allerdings vergleichsweise langsam ist).

Edelfix 18. Jun 2019 11:34

AW: String im record nach DLL
 
der Hinweis mit "UniqueString" kling interessant.

Vielen dank.

Codehunter 18. Jun 2019 15:55

AW: String im record nach DLL
 
Von meiner Seite ganz klar pro PChar. Schnell und immer kompatibel. Für Risikofreudige geht auch die Kombination aus FastMM4 und String. Allerdings nur, wenn man beide Seiten (DLL und Programm) so kompiliert.


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