Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c