Главная страница
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.029 c
14-1091785039
Cerberus
2004-08-06 13:37
2004.08.22
Текстовые фаилы


3-1091185025
46_55_41_44
2004-07-30 14:57
2004.08.22
Хочу создать программно БД на Access 97. Помогите...


4-1088528362
djone
2004-06-29 20:59
2004.08.22
TreeView


10-1029755420
Condor_av
2002-08-19 15:10
2004.08.22
Несколько вопросов по idl2pas & Corba


14-1091094948
Nelud
2004-07-29 13:55
2004.08.22
Хоумпейдж сделал.