Вы публикуете содержимое переменной String
, которая является локальной для процедуры потока, вызывающей PostMessage()
. Если String
выходит из области видимости и освобождается до того, как основной поток обработает опубликованное сообщение, память станет мусором.
Вам нужно либо:
1) используйте SendMessage()
вместо PostMessage()
, поэтому String
остается в области действия до выхода из обработчика сообщений:
SendMessage(MainHandle, UM_CLONE, UM_756, LPARAM(PChar(s_out)));
2) динамически распределяет String
в памяти, заполняет его по мере необходимости, публикует его, а затем позволяет основному обработчику сообщений освободить его, когда он закончит копирование:
var
s_out: PString;
New(s_out);
...
s_out^ := s_out^ + chr(dec);
...
if not PostMessage(MainHandle, UM_CLONE, UM_756, LPARAM(s_out)) then
Dispose(s_out);
.
var
ps: PString;
i: String;
ps := PString(msg.LParam);
i := ps^;
Dispose(ps);
PS: обратите внимание, я также изменил ваш Integer()
актерский состав на LPARAM()
. Это очень важно, если вы когда-нибудь обновитесь до Delphi XE2 или новее. PostMessage()
и SendMessage()
использовать LPARAM
, а не Integer
. Вы можете избежать неприятностей в Delphi 7, потому что LPARAM
- это псевдоним для Integer
в этой версии, но это не так в современных версиях Delphi. LPARAM
является псевдонимом для NativeUInt
сейчас. LPARAM
всегда был незапятнанным типом в Win32 API, Delphi просто ошибался в ранних версиях, но Embarcadero действительно настаивал на корректности типов в RTL / VCL, так как добавил поддержку 64-битной и кроссплатформенной развитие. Если вы не соответствуете правильным типам данных, вы можете вызвать ошибки проверки диапазона и тому подобное во время выполнения.