Показать сообщение отдельно
  #13  
Старый 04.05.2012, 18:24
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Дизассемблируй свой пример и посмотри на строку до копирования в s. На её конце стоит ноль. Поэтому преобразование вида
Код:
PAnsiChar(Pointer(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;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием