Дизассемблируй свой пример и посмотри на строку до копирования в s. На её конце стоит ноль. Поэтому преобразование вида
или
Код:
var p:pointer;
...
P:=Pointer(S);
ShowMessage(PAnsiChar(P));
или
Код:
asm
mov eax, s
mov p, eax
end;
ShowMessage(PAnsiChar(P));
и даже
Код:
Getmem(p, Length(s)+1);
CopyMemory(p, Pointer(s), Length(s)+1);
ShowMessage(PAnsiChar(p));
нормально работает.
А вот приведение PChar->String, конечно, проводить нужно. При этом строка, разумеется, копируется до первого нуля, и высчитывается её размер.
ЗЫЖ кстати, если посмотреть код функции преобразования String в PChar, то можно увидеть, что так оно и есть:
Код:
function _LStrToPChar(const S: AnsiString): PAnsiChar;
begin
If Pointer(s) = nil then
Result := @EmptyStringA.Nul
else
Result := Pointer(s);
end;