![]() |
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:
würde es auch so gehen:
type
MyRecord = test: shortstring; ... end; procedure SomeAPI(... var Rec: MyRecord; ...); //geht nach DLL
Delphi-Quellcode:
Bei shortstring ist die Länge klar. Bei String ist die Länge dynamisch. Könnte ein Problem sein?
type
PMyRecord = ^MyRecord; MyRecord = test: String; ... end; procedure SomeAPI(... Rec: PMyRecord; ...); //geht nach DLL |
AW: String im record nach DLL
Ein
Delphi-Quellcode:
ist ein Referenz-Typ. Im record steht also nur ein Referenz-Zeiger und der bringt dir in diesem Fall nichts.
string
|
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. |
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.
|
AW: String im record nach DLL
Hallo,
dann probier aus, welcher meiner beiden gesagten Stringtypen bei dir funktioniert. |
AW: String im record nach DLL
Zitat:
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). |
AW: String im record nach DLL
der Hinweis mit "UniqueString" kling interessant.
Vielen dank. |
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 00:51 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