![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PostMessage [D7, WinXP]
Ozone © (2004-07-08 08:40:00)Что-то не получается с PostMessage'ом.
WM_TEST = WN_USER + 1;
procedure Test(var s: integer); message WM_TEST;
{...}
procedure TForm1.Test(var s: integer);
var
T: String;
begin
T := String(s);
ShowMessage(T); // на этом месте вываливается ??? AV
end;
{...}
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
begin
S := 'test';
PostMessage(Handle, WM_TEST, integer(S), 0);
end;
{...}
Что я неправильно делаю?
Тимохов (2004-07-08 11:51:00) [1]согласен с 10.
Я делаю:
1. Либо синхронное сообщение (т.е. sendmessage)
2. Либо авинхрннное (т.е. postmessage), но отправляющая сторона выделяет память, принмающая отправляет.
3. Если между приложениеми, то wm_copydata, но синхронное!
panov (2004-07-08 11:30:00) [2]Для проверки того, что код из [1] работать не будет, достаточно немного модифицировать код таким образом:
procedure TForm1.Button1Click(Sender: TObject);
var
s,s1: String;
begin
s := 'sdfsdfsdfsdf';
s1 := s+'1';
PostMessage(Handle,WM_TEST,Integer(s1),0);
end;
Правильно будет выделять память под строку при отправке сообщения, освобождать ее при обработке сообщеня.
KADAN (2004-07-08 09:23:00) [3]Извини, не сразу заметил:
procedure Test(var Msg:TMessage); message WM_TEST;
{...}
procedure TForm1.Test(var Msg:TMessage);
var
T: String;
begin
T := PChar(msg.WParam);
ShowMessage(T);
end;
Reindeer Moss Eater (2004-07-08 09:13:00) [4]нада знать время жизни локальных переменных функций и процедур
KADAN (2004-07-08 09:12:00) [5]
> Ozone © (08.07.04 09:08) [6]
>
> Нада...
тогда просто исправь PostMessage на SendMessage. Она ожидает обработки сообщения и тогда не будет AV.
Ozone (2004-07-08 09:08:00) [6]KADAN © (08.07.04 09:05) [4]
Нада...
Reindeer Moss Eater (2004-07-08 09:07:00) [7]а зачем WM_COPYDATA c уничтожаемой строкой?
KADAN (2004-07-08 09:05:00) [8]а зачем посылать строку внутри процесса?
Reindeer Moss Eater (2004-07-08 09:03:00) [9]И это внутри-то одного единственного процесса лучше?
KADAN (2004-07-08 09:01:00) [10]может лучше WM_COPYDATA
Reindeer Moss Eater (2004-07-08 08:53:00) [11]begin
S := 'test';
PostMessage(Handle, WM_TEST, integer(S), 0);
end;
Сразу после PostMessage строка S перестает быть живой.
Выходит из области видимости и потому уничтожается.