Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 перестает быть живой.
Выходит из области видимости и потому уничтожается.


Наверх

Титульная страница Поиск, карта сайта Написать письмо