Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задачка.... [D5]


Страницы:   1 2

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





Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо