Ich hätte nicht gedacht, so eine Frage einmal stellen zu müssen. Das Thema PWideChar/PAnsiChar/PChar sollte hier ja eigentlich zur Genüge abgefrühstückt worden sein.
Trotzdem bin ich hiermit auf die Nase gefallen, und ich verstehe es nicht:
Habe ich eine Variable
myStrA: AnsiString
, gibt der Cast
PChar(myStrA)
nicht einen
PChar
sondern einen
PAnsiChar
zurück! Warum? Noch besser: Warum verhält sich
PChar(AnsiString('Test'))
anders und gibt, wie erwartet, einen
PChar
zurück?
Das Beispielprogramm
Delphi-Quellcode:
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
program Project99;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
var
myPChar: PChar;
myStrA: AnsiString;
myStrB: String;
procedure printChars(const content: Pointer);
const
maxLength: Integer = 10;
var
pos: Integer;
foundNull: Boolean;
begin
Write(sLineBreak);
foundNull := False;
for pos := 0 to Pred(maxLength) do begin
Write( (PByte(content)+pos)^ );
if (PByte(content)+pos)^ = 0 then
if not foundNull then
foundNull := True
else
Break
else
foundNull := False;
Write('.');
end;
Write(sLineBreak);
end;
begin
myStrA := 'Test';
myPChar := PChar(myStrA); // W1044 Bedenkliche Typumwandlung von AnsiString in PWideChar
printChars(myPChar);
myPChar := PChar(AnsiString('Test'));
printChars(myPChar);
myStrB := 'Test';
myPChar := PChar(myStrB);
printChars(myPChar);
readln;
end.
erzeugt folgende Ausgabe
Code:
84.101.115.116.0.0
84.0.101.0.115.0.116.0.0
84.0.101.0.115.0.116.0.0