Die #0 fügt Delphi (AFAIK
) schon automatisch an verwaltete Strings an.
Wäre mir neu
Würde ich mich, selbst wenn es so ist, aber auf keinen Fall drauf verlassen. "Normale" Strings sind in Delphi nicht nullterminiert, sondern enthalten ein vorangestelltes Längenbyte. Unter dem Gesichtspunkt ist für den Delphi Compiler ja keine Notwendigkeit gegeben noch irgendwelche Nullen hinzuzufügen.
Aus reiner Delphi-Sicht nicht. Aber eben genau, um einfache Interaktion mit der
API zu ermöglichen, wird m.W. die Null drangehängt. Das müsste dokumentiertes Verhalten sein. Ich bin aber zu faul, das jetzt rauszusuchen.
Und statt @Source[1] lieber den passenden Cast nehmen
Macht keinen Unterschied:
Code:
Unit1.pas.63: RtlInitUnicodeString(@UnicodeString, @Source[1]);
005C7383 8B45F8 mov eax,[ebp-$08]
005C7386 E8252DE4FF call @WStrToPWChar
005C738B 50 push eax
005C738C 8D45F0 lea eax,[ebp-$10]
005C738F 50 push eax
005C7390 E8B7FFFFFF call RtlInitUnicodeString
Unit1.pas.64: RtlInitUnicodeString(@UnicodeString, PWideChar(Source));
005C7395 8B45F8 mov eax,[ebp-$08]
005C7398 E8132DE4FF call @WStrToPWChar
005C739D 50 push eax
005C739E 8D45F0 lea eax,[ebp-$10]
005C73A1 50 push eax
005C73A2 E8A5FFFFFF call RtlInitUnicodeString
WIMRE macht es einen Unterschied, wenn Source = '' ist. Vielleicht erkennt der Compiler, dass das in dem Beispiel nicht der Fall ist und lässt deshalb die Prüfung weg. Vermutlich taucht ein Unterschied auf, wenn man das ganze z.B. in eine Prozedur mit Source als Argument steckt.