![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задачка.... [D5]
AVD © (2002-11-14 15:25:00)Люди! Подскажите.
Мне надо сделать 2 приложения чтобы они могли обмениваться между собой чем либо ну напимер строками когда они оба запущены.
Чем мне надо воспользоваться для создания сего ???
Infinity (2002-11-15 20:18:00) [1]А почему бы не использовать сообщение WM_User?
Типо PostMessage (Handle окна куда передать , wm_user , data : integer , nil)
А потом его обработать в программе.
Типо
procedure GetString ( var Msg : TMessage);message WM_USER;
//--------
procedure GetString (var Msg : TMessage);
var
Text: string;
begin
Text :=chr( msg.wParam);
end;
P.S. Послать можно только integer следовательно преобразовываем символы в код. В пимере передача идёт по байтам. Btw Можно передать и целую строку
Fox (2002-11-15 12:09:00) [2]Ссылка по теме
http://www.pcmag.ru/archive/9708/089727.asp
gvb (2002-11-15 11:27:00) [3]Очень простой способ - использовать компоненты
NMMsg и NMMSGServ при этом строка пуляется на порт сервера,
правда без всякого контроля корректности.
Если нужен контроль - NMGeneralServer - и придумывай свой протокол обмена...
AVD (2002-11-15 10:50:00) [4]Хотя всеже однозначно не понятно как посылать события от этого сервера...
AVD (2002-11-15 10:45:00) [5]Спасибо всем! Благодаря вашим ответам я пришел
к однозначному выводу что лучьше и проще оле ничего не придумать.
Mute (2002-11-15 10:43:00) [6]А что мастера скажут о возможности передавать вариантные массивы через интерфейсы (при условии больших объемов данных)?
apay (2002-11-15 10:01:00) [7]мудрено что-то пишете... :)
просто надо создать глобальный атом (GlobalAddAtom), его передать ч/з SendMesage, во втором прил. получить его имя(GetAtomName) и удалить его (DeleteAtom).
Проще надо быть, и люди потянутся ... :)
Александр Павлов (2002-11-15 08:57:00) [8]Как на счёт отображённых в пямять файлов?
FileOpen(),CreateFileMapping(),MapViewOfFile().
AngeL B. (2002-11-15 08:50:00) [9]1) Общая память через отображения файлов
hFM = CreateFileMapping(INVALID_HANDLE_VALUE, ..., "имя отображения");
...
Тогда будет создано отображени части страничного файла.
2) Создать именованную трубу (CreateNamedPipe)
3) использовать вариант AVD
AVD (2002-11-15 08:40:00) [10]FindWindow ("TFormGetData", "GetData");
А если у приложения нет формы ?
А если приложение это оле сервер ?
Вообщето смысл вот в чем:
Есть приложение оно будет работать всегда. Типа сервер.
Будут запускаться другие приложения эти приложнния будут использовать некий оле сервер который в свою очередь должен
подключиться к работающему в качестве сервера приложению
и обмениваться с ним данными в обоих направлениях.
???
Skier (2002-11-14 16:17:00) [11]>han_malign
предполагается обмениваться с помощью WM_COPYDATA
оно всё сделает за нас :) см. MBo © (14.11.02 16:10)
про кастинг к Integer я наврал - давно WM_COPYDATA не пользовался...
Calm (2002-11-14 16:14:00) [12]2 MBO
Никто не спорит :)
Под невозможностью передачи через сообщения подразумевались собственные сообщения программ.
> Вариант 2.
> Использовать своисообщения.
han_malign (2002-11-14 16:12:00) [13]2 MBo
2 MBo - побайтово??? :)- я имел ввиду пользовательское сообщение (CM_РаздачаСлонов :) )
Skier (2002-11-14 16:11:00) [14]
Посылаем строку
procedure TForm1.BtnSendCopyDataClick(Sender: TObject);
var
Cds: TCopyDataStruct;
Hwnd: THandle;
begin
// small data (32 bits): top of form
Cds.dwData := Top;
// size of data
Cds.cbData := Length (Caption) + 1;
// allocate memory for the large block and fill it
Get
Mem (Cds.lpData, Cds.cbData );
StrCopy (Cds.lpData, PChar (Caption));
// get the handle of the target window
Hwnd := FindWindow ("TFormGetData", "GetData");
if Hwnd <> 0 then
begin
// send the message
if SendMessage (
Hwnd, WM_COPYDATA, Handle, Cardinal(@Cds)) = 1 then
// received
Beep;
end
else
// target not found
ShowMessage ("GetData window not found.");
FreeMem (Cds.lpData);
end;
MBo (2002-11-14 16:10:00) [15]цитата из Рихтера
Увидев, что Вы посылаете сообщение WM_COPYDATA, SendMessage создает проекцию файла размером cbData байтов и копирует данные из адресного пространства Вашей программы в эту проекцию. Затем отправляет сообщение окну-приемнику При обработке этого сообщения принимающей оконной процедурой параметр lParam указывает на структуру COPYDATASTRUCT, которая находится в адресном простран стве процесса-приемника Элемент lpData этой структуры указывает на проекцию файла в адресном пространстве процесса-приемника.
MBo (2002-11-14 16:07:00) [16]Источник
procedure TForm5.Button1Click(Sender: TObject);
var h:THandle;
Data: TCopyDataStruct;
s:String;
begin
s:=Memo1.Lines.Text;
h:=FindWindow("TFormA", nil);
if h>0 then begin
label1.caption:="found";
Data.dwData := 0;
Data.cbData := Length(s);
Data.lpData := @s[1];
SendMessage(h, WM_COPYDATA,0,integer(@Data));
end;
end;
Приемник
procedure TFormA.WmCopyData(var Message: TMessage);
var s:string;
begin
SetLength(s, PCopyDataStruct(Message.LParam)^.cbData);
Move(PCopyDataStruct(Message.LParam)^.lpData^,s[1],Length(s));
Memo1.Lines.Text:=s;
end;
han_malign (2002-11-14 16:07:00) [17]2 Skier - 2 приложения чтобы они могли обмениваться между собойя так понимаю - два экземпляра(процесса), причем разных, причем здесь исходники(они давно опочили в архиве разработчика(после успешного завершения проекта)), или предлагается обмениваться индексами намертво забитых строковых констант(или строго фиксированных наборов данных)?
З.Ы. 2 All(кроме DVM) - File Mapping, Pipe, MailSlot - притянуто MS за уши, а вот Сокеты действительно работают везде.
Calm (2002-11-14 16:06:00) [18]2 Skier
> А при чём тут адресное пространство другого процесса ?
Как это причем? Разные программы, разные сегменты данных - разные данные по одному адресу. Адрес переменной - это ведь не абсолютный физический адрес, а только исполнительный (эффективный), т.е. смещение внутри сегмента.
Я ничего не путаю, Мастера?
> Я исхожу из того что исходники приложений автору доступны...
А вот причем здесь исходники, не знаю я. Ну есть исходники, и что?
Skier (2002-11-14 15:55:00) [19]>han_malign
Я исхожу из того что исходники приложений автору доступны...
А при чём тут адресное пространство другого процесса ?
k (2002-11-14 15:54:00) [20]>Skier © (14.11.02 15:47)
в одном процессе Integer(PCharVar) указывает на одно, а в другом - ни на что.....
через сообщения строку можно по буквам прередать
а "легальный" способов передачи - переменные Variant