Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

PostMessage   Найти похожие ветки 

 
Ozone ©   (2004-07-08 08:40) [0]

Что-то не получается с 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;
{...}


Что я неправильно делаю?


 
Reindeer Moss Eater ©   (2004-07-08 08:53) [1]

begin
   S := "test";
   PostMessage(Handle, WM_TEST, integer(S), 0);
end;

Сразу после PostMessage строка S перестает быть живой.
Выходит из области видимости и потому уничтожается.


 
KADAN ©   (2004-07-08 09:01) [2]

может лучше WM_COPYDATA


 
Reindeer Moss Eater ©   (2004-07-08 09:03) [3]

И это внутри-то одного единственного процесса лучше?


 
KADAN ©   (2004-07-08 09:05) [4]

а зачем посылать строку внутри процесса?


 
Reindeer Moss Eater ©   (2004-07-08 09:07) [5]

а зачем WM_COPYDATA c уничтожаемой строкой?


 
Ozone ©   (2004-07-08 09:08) [6]

KADAN ©   (08.07.04 09:05) [4]

Нада...


 
KADAN ©   (2004-07-08 09:12) [7]


> Ozone ©   (08.07.04 09:08) [6]
>
> Нада...

тогда просто исправь PostMessage на SendMessage. Она ожидает обработки сообщения и тогда не будет AV.


 
Reindeer Moss Eater ©   (2004-07-08 09:13) [8]

нада знать время жизни локальных переменных функций и процедур


 
KADAN ©   (2004-07-08 09:23) [9]

Извини, не сразу заметил:
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;


 
panov ©   (2004-07-08 11:30) [10]

Для проверки того, что код из [1] работать не будет, достаточно немного модифицировать код таким образом:

procedure TForm1.Button1Click(Sender: TObject);
var
 s,s1: String;
begin
 s := "sdfsdfsdfsdf";
 s1 := s+"1";
 PostMessage(Handle,WM_TEST,Integer(s1),0);
end;


Правильно будет выделять память под строку при отправке сообщения, освобождать ее при обработке сообщеня.


 
Тимохов ©   (2004-07-08 11:51) [11]

согласен с 10.

Я делаю:
1. Либо синхронное сообщение (т.е. sendmessage)
2. Либо авинхрннное (т.е. postmessage), но отправляющая сторона выделяет память, принмающая отправляет.
3. Если между приложениеми, то wm_copydata, но синхронное!



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.059 c
14-1091466244
Fay
2004-08-02 21:04
2004.08.22
Mozilla FireFox 0.9


1-1092044082
V l a d i m i r
2004-08-09 13:34
2004.08.22
Работа с Excel


1-1091891903
Maxim
2004-08-07 19:18
2004.08.22
GetDir


1-1091171279
BRemB
2004-07-30 11:07
2004.08.22
Главное меню приложения


14-1091757883
Думкин
2004-08-06 06:04
2004.08.22
С днем рождения! 6 августа