Главная страница
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.046 c
3-1091175283
ksa2002
2004-07-30 12:14
2004.08.22
IB StoredProc


14-1091601554
Stany
2004-08-04 10:39
2004.08.22
сетевые глюки винды


3-1091002043
Wolfram
2004-07-28 12:07
2004.08.22
Проблемы при переходе с Paradox на Access


3-1091159310
don-do
2004-07-30 07:48
2004.08.22
Помогите плз. ссылкой или кодом


3-1090831438
qwerty2
2004-07-26 12:43
2004.08.22
Что за файл такой PDOXUSRS.NET?