![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщение форме [D2005, XP]
Квэнди © (2007-01-29 18:35:00)Здравствуйте.
Есть следующий код:
в самой программе:
function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex');
Result := (HM <> 0);
if HM = 0 then HM := CreateMutex(nil, false, 'MyOwnMutex');
end;
begin
if (Check)and(paramcount=0) then
begin
showmessage('Приложение запущено!');
exit;
end;
if (Check)and(paramcount>0) then
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('software\linkterm',true);
han:=reg.ReadInteger('handle');
reg.CloseKey;
reg.Free;
szz:=paramstr(1);
SendMessage(han, MY_MESSAGE,0,dword(pchar(szz)));
Exit;
end;
В форме этой программы, которой посылается сообщение:
protected
procedure MessageReceiver(var msg: TMessage); message MY_MESSAGE;
procedure tfstart.MessageReceiver(var msg: TMessage);
var s:pchar;
begin
s:=pchar(msg.LParam);
msg.Result:=1;
showmessage(s);
end;
Вот вопрос:
почему у меня в самой программе (проверял выводом сообщения, содержащего szz строка правильная, а после передачи в окно в lparam оказывается почему-то просто адрес исполняемого файла ?
Квэнди (2007-01-29 19:08:00) [1]Извиняюсь, совсем шарики заехали (
все заработало спасибо )
код вроде верный:
сама программа:
data:TCopyDataStruct;
with data do
begin
dwData := 0;
cbdata:=strlen(pchar(paramstr(1)))+1;
lpData:=pchar(paramstr(1));
end;
SendMessage(han, WM_COPYDATA,application.Handle,longint(@data));
в модуле формы:
protected
procedure MessageReceiver(var msg: TWMCopyData); message WM_COPYDATA;
procedure tfstart.MessageReceiver(var msg: TWMCopyData);
var
sText: array[0..99] of Char;
begin
StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
showmessage(stext);
end;
Спасибо огромное за помощь.
Квэнди (2007-01-29 19:00:00) [2]Переписал:
в самой программе все тоже самое, но:
SendMessage(han, WM_COPYDATA,0,dword(pchar(szz)));
В модуле формы:
protected
procedure MessageReceiver(var msg: TMessage); message WM_COPYDATA;
procedure tfstart.MessageReceiver(var msg: TMessage);
var s:pchar;
begin
s:=pchar(msg.LParam);
msg.Result:=1;
showmessage(s);
end;
теперь вообще никакой реакции после отправки сообщения, т.е. оно вообще не "отлавливается"
MBo (2007-01-29 18:55:00) [3]У приложений разные адресные пространства
Используй сообщение WM_COPYDATA
Квэнди (2007-01-29 18:37:00) [4]Да, само собой что и в самой программе и в модуле формы определено:
const
MY_MESSAGE = WM_USER + 4242;