AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String im record nach DLL

Ein Thema von Edelfix · begonnen am 18. Jun 2019 · letzter Beitrag vom 18. Jun 2019
Antwort Antwort
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#1

String im record nach DLL

  Alt 18. Jun 2019, 08:27
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?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: String im record nach DLL

  Alt 18. Jun 2019, 08:33
Ein string ist ein Referenz-Typ. Im record steht also nur ein Referenz-Zeiger und der bringt dir in diesem Fall nichts.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: String im record nach DLL

  Alt 18. Jun 2019, 08:33
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.
Heiko
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: String im record nach DLL

  Alt 18. Jun 2019, 09:08
Die DLL ist miene und nur meine. Die Frage kommt weil ich eventuell mit der Länge von shortstring nicht hin komme.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: String im record nach DLL

  Alt 18. Jun 2019, 09:24
Hallo,
dann probier aus, welcher meiner beiden gesagten Stringtypen bei dir funktioniert.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch
Online

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

AW: String im record nach DLL

  Alt 18. Jun 2019, 09: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
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: String im record nach DLL

  Alt 18. Jun 2019, 12:34
der Hinweis mit "UniqueString" kling interessant.

Vielen dank.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: String im record nach DLL

  Alt 18. Jun 2019, 16:55
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 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