![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить параметры для уже выполняющейся программы? [D7, XP]
andreil © (2008-03-20 17:23:00)Есть у меня две мои прогораммы. Обе они должны обмениваться сообщениями, типа "распаковать это, сконвертировать то".
Говорю сразу - объеденить обе программы невозможно, тк одна написана на Дельфи, а другая - на С.
Вопрос: как организовать такой обмен сообщениями? Причем этот обмен должен происходить с передачей параметров (строки).
Лично мне на ум приходит SendMessage, но как это организовать?
Германн (2008-03-20 21:43:00) [1]
> Семеныч (20.03.08 19:57) [7]
> Помните фильм "Ирония судьбы или с легким паром"? То же и здесь.
Плагиат :)
andreil (2008-03-20 20:16:00) [2]Все, ответ нашел:
получатель:
procedure ReceiveMessage (var Msg: TMessage); message WM_COPYDATA;
..
procedure TFormReceive.ReceiveMessage;
var
pcd : PCopyDataStruct;
begin
pcd := PCopyDataStruct(Msg.LParam);
Caption := PChar(pcd.lpData);
end;
отправитель:
procedure TFormXXX.Button1Click(Sender: TObject);
var
cd : TCopyDataStruct;
begin
cd.cbData := Length(Edit1.Text)+1;
cd.lpData := PChar(Edit1.Text);
SendMessage ( FindWindow('TFormReceive', nil),
WM_COPYDATA,
0,
LParam(@cd));
end;
Leonid Troyanovsky
Семеныч (2008-03-20 19:57:00) [3]> andreil © (20.03.08 19:50) [5]
> тарабарщина вместо текста
Правильно. Вы передали адрес и он успешно передался. Но по этому адресу в программе-получателе находится совсем не то, что в программе отправителе.
Помните фильм "Ирония судьбы или с легким паром"? То же и здесь.
WM_COPYDATA Вам нужно. Тогда переданы будут сами данные, а не их адреса.
ЦУП (2008-03-20 19:51:00) [4]
> andreil © (20.03.08 19:50) [5]
см.
> Семеныч (20.03.08 18:11) [3]
>... А если нет, то надо слать WM_COPYDATA.
andreil (2008-03-20 19:50:00) [5]Мне надо переслать строку ;)
Сделал так:
SendMessage(Handle, UpkMessage, 0, DWORD(pChar('msg')));-у "клиента"
function TForm1.KOLForm1Message(var Msg: tagMSG;- у "сервера".
var Rslt: Integer): Boolean;
begin
result:=false;
if Msg.message=UpkMessage then
MessageBox(Form.Handle, pChar(Msg.lParam), '', 0);
end;
В итоге - тарабарщина вместо текста :(
ЦУП (2008-03-20 19:01:00) [6]Также можно испольовать Pipe's, Soket's, MailSlot's...
Семеныч (2008-03-20 18:11:00) [7]> andreil © (20.03.08 17:23)
Если параметры умещаются в WParam и LParam, то можно слать любое сообщение (см. RegisterMessage). А если нет, то надо слать WM_COPYDATA.
Palladin (2008-03-20 17:42:00) [8]
> объеденить обе программы невозможно, тк одна написана на
> Дельфи, а другая - на С.
не, ну я понимаю, была'б одна под солярис, другая под win95. тогда, да, поблемы. а так... не аргумент'с...
Kolan (2008-03-20 17:24:00) [9]> Лично мне на ум приходит SendMessage, но как это организовать?
Ну так и организовать. Одна посылает сообщения, другая принимает