AGB  ·  Datenschutz  ·  Impressum  







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

Strings in Delphi in DLL

Ein Thema von Blatt · begonnen am 21. Okt 2010 · letzter Beitrag vom 21. Okt 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#1

AW: Strings in Delphi in DLL

  Alt 21. Okt 2010, 12:15
Man kann nicht einfach so einen Record via Socked verschicken, in welchem solche dynamische Elemente (DynArray, String, Objekt usw.) enthalten sind.

Im Record liegt von dem dynArray nur ein Zeiger, die Arraydaten verstecken sich wo anders und werden nicht mit verschickt.


Zitat:
GetMem(x, 8);
Für derartige Records reserviert man besser über Delphi-Referenz durchsuchenNew und Delphi-Referenz durchsuchenDispose den Speicher.
Nicht über GetMem/GetMemory und gibt sie erst ggarnicht über FreeMem wieder frei.

Move('hello', a.buf, 6); .
Ab Delphi 2009 tritt man mit der festen 6 in ein schönes Unicode-Fettnäpfchen.
Außerdem hast du vergessen für das dynamische Array vergessen Speicher zu reservieren > Delphi-Referenz durchsuchenSetLength.
Und das Move überschreibt hier den internen Zeiger und schreibt nicht in den Datenbereich des Arrays.


Delphi-Quellcode:
foo = record
  other: Word;
  buf: Array[0..0] of AnsiChar;
end;
- Ansi zur Vorsorge wegen eventuellem Unicode-Compiler
- über GetMem dann genügend Speicher für den gesamten Text reservieren.

Delphi-Quellcode:
Text := 'hello'; // Text = AnsiString
GetMem(a, 2{other} + Length(Text) + 1{#0}); //a := GetMemory(2{other} + Length(Text) + 1{#0});
a.other := 2;
Move(Text[1], a.buf[0], Length(Text) + 1);
Da in diesem Beispiel ein statisches Array verwendet wird, könnte man hier die [0] zwar weglassen, aber zur Sicherheit macht es sich mit [0] besser und vom Compilat her ist das Ergebnis so oder so gleich.

Geändert von himitsu (21. Okt 2010 um 12:29 Uhr)
  Mit Zitat antworten Zitat
Blatt

Registriert seit: 8. Sep 2010
17 Beiträge
 
#2

AW: Strings in Delphi in DLL

  Alt 21. Okt 2010, 12:25
Achso, Array of Char ist ein Pointer..
Ich hab das wortwörtlich genommen..
Wie soll das Record denn dann aussehen?
Es ist halt ein nullterminierter String mit unbekannter Größe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#3

AW: Strings in Delphi in DLL

  Alt 21. Okt 2010, 12:31
Ein dynamisches Array, der String, Objekte und Interfaces bestehen intern aus einem Zeiger auf ihre Daten.
Im Record selber ist eben immer nur der 4 Byte kleine Zeiger.
Nur bei statischen Arrays und Records stecken die Daten direkt an der entsprechenden Speicherstelle (ohne internen Zeiger).


Wie man es z.B. machen könnte, hatte ich inzwischen im letzen Beitrag nacheditiert.
Ein Therapeut entspricht 1024 Gigapeut.
  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 18:33 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