Einzelnen Beitrag anzeigen

Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: String im record nach DLL

  Alt 18. Jun 2019, 08:55
Ein 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).
Thomas Mueller
  Mit Zitat antworten Zitat