Korrekt.Wenn ich jetzt folgenden Code habe:
var s:string;
s:='Hallo';
WriteString(s);
Bei einem ShortString würden jetzt "vermutlich" 5 Bytes gesendet werden.
Das Längenbyte und die ersten 4 Buchstaben "Hall"
Das letzte "o" würde also fehlen,
Weil im ersten Byte befindet sich ja die Längenangabe und dann folgen die Asciizeichen.
demnach müste ich schreiben:
WriteFile(fHandle,s[1],length(s),written,@Foverlapped);
Nein, das erste Zeichen ist immer Index 1.Aber was, wenn es kein ShortString ist ?
Bei einem Nullterminierten String muss ich s[0] verwenden.
Ein langer String ist ein Pointer auf das erste Zeichen (= Adresse von s[1]) des strings. Davorgestellt ist eine Speicherblock mit diesem Aufbau (aus rtl/inc/astrings.inc):Stellt sich mir grad die Frage woher die Funktion length eigentlich weis, wie die Länge des Strings ermittelt wird.
Code: Alles auswählen
{
This file contains the implementation of the AnsiString type,
and all things that are needed for it.
AnsiString is defined as a 'silent' pchar :
a pchar that points to :
@-16 : Code page indicator.
@-12 : Character size (2 bytes)
@-8 : SizeInt for reference count;
@-4 : SizeInt for size;
@ : String + Terminating #0;
Pchar(Ansistring) is a valid typecast.
So AS[i] is converted to the address @AS+i-1.
Constants should be assigned a reference count of -1
Meaning that they can't be disposed of.
}
Type
PAnsiRec = ^TAnsiRec;
TAnsiRec = Record
CodePage : TSystemCodePage;
ElementSize : Word;
{$ifdef CPU64}
{ align fields }
Dummy : DWord;
{$endif CPU64}
Ref : SizeInt;
Len : SizeInt;
end;
Also erscheint mir meine SendeRoutine für Strings relativ unkontrolliert
und daher meine Frage: wie mache ich das am Sinnvollsten.
Code: Alles auswählen
Procedure WriteString(s:string);
var written:cardinal;
bein
WriteFile(fHandle,s[1],length(s),written,@Foverlapped);
end;