Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.706 Beiträge
 
Delphi 2007 Professional
 
#13

AW: Probleme mit RtlRunEncodeUnicodeString

  Alt 24. Sep 2015, 15:29
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.
Uli Gerhardt
  Mit Zitat antworten Zitat