Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.28;
Скачать: CL | DM;

Вниз

Задачка....   Найти похожие ветки 

 
AVD   (2002-11-14 15:25) [0]

Люди! Подскажите.
Мне надо сделать 2 приложения чтобы они могли обмениваться между собой чем либо ну напимер строками когда они оба запущены.
Чем мне надо воспользоваться для создания сего ???


 
MBo ©   (2002-11-14 15:27) [1]

один из путей - посылать WM_COPYDATA


 
Calm ©   (2002-11-14 15:28) [2]

Вариант 1.
Использовать DDE. Imho, замороченое дело...

Вариант 2.
Использовать свои сообщения.


 
Calm ©   (2002-11-14 15:30) [3]

А вот строку, наверное, между двумя приложениями через сообщение не передать...


 
Гарик   (2002-11-14 15:31) [4]

2CALM
Как по варианту 2 обмениваться строковыми сообщенимя?
однозначно, самое оптимальное, - WM_COPYDATA


 
Calm ©   (2002-11-14 15:41) [5]

2 Гарик
Да я, конечно, поторопился :(
Строку сообщением не передать.


 
MBo ©   (2002-11-14 15:43) [6]

>Строку сообщением не передать.
Разве что-то мешает?


 
Skier ©   (2002-11-14 15:47) [7]

>Calm

> Строку сообщением не передать.

Ну да...ну да...,но можно передать
указатель на неё (Integer(StrVar), Integer(PCharVar))

Не продаётся вдохновенье, но можно рукопись продать. :)


 
han_malign ©   (2002-11-14 15:48) [8]

2 MBo - побайтово??? :)
в принципе, через File Mapping, Pipe, WinSock, MailSlot
З.Ы. Можно побитово через два объекта синхронизации :)))


 
han_malign ©   (2002-11-14 15:50) [9]

2 Scier
указатель на адресное пространство другого процесса ??? $:[]


 
DVM   (2002-11-14 15:51) [10]

Еще можно через Сокеты - наиболее универсально будет


 
©   (2002-11-14 15:54) [11]

>Skier © (14.11.02 15:47)

в одном процессе Integer(PCharVar) указывает на одно, а в другом - ни на что.....

через сообщения строку можно по буквам прередать

а "легальный" способов передачи - переменные Variant






 
Skier ©   (2002-11-14 15:55) [12]

>han_malign
Я исхожу из того что исходники приложений автору доступны...
А при чём тут адресное пространство другого процесса ?


 
Calm ©   (2002-11-14 16:06) [13]

2 Skier

> А при чём тут адресное пространство другого процесса ?

Как это причем? Разные программы, разные сегменты данных - разные данные по одному адресу. Адрес переменной - это ведь не абсолютный физический адрес, а только исполнительный (эффективный), т.е. смещение внутри сегмента.
Я ничего не путаю, Мастера?


> Я исхожу из того что исходники приложений автору доступны...


А вот причем здесь исходники, не знаю я. Ну есть исходники, и что?


 
han_malign ©   (2002-11-14 16:07) [14]

2 Skier - 2 приложения чтобы они могли обмениваться между собой я так понимаю - два экземпляра(процесса), причем разных, причем здесь исходники(они давно опочили в архиве разработчика(после успешного завершения проекта)), или предлагается обмениваться индексами намертво забитых строковых констант(или строго фиксированных наборов данных)?
З.Ы. 2 All(кроме DVM) - File Mapping, Pipe, MailSlot - притянуто MS за уши, а вот Сокеты действительно работают везде.


 
MBo ©   (2002-11-14 16:07) [15]

Источник

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;


 
MBo ©   (2002-11-14 16:10) [16]

цитата из Рихтера

Увидев, что Вы посылаете сообщение WM_COPYDATA, SendMessage создает проекцию файла размером cbData байтов и копирует данные из адресного пространства Вашей программы в эту проекцию. Затем отправляет сообщение окну-приемнику При обработке этого сообщения принимающей оконной процедурой параметр lParam указывает на структуру COPYDATASTRUCT, которая находится в адресном простран стве процесса-приемника Элемент lpData этой структуры указывает на проекцию файла в адресном пространстве процесса-приемника.



 
Skier ©   (2002-11-14 16:11) [17]


Посылаем строку


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;


 
han_malign ©   (2002-11-14 16:12) [18]

2 MBo
2 MBo - побайтово??? :) - я имел ввиду пользовательское сообщение (CM_РаздачаСлонов :) )


 
Calm ©   (2002-11-14 16:14) [19]

2 MBO
Никто не спорит :)
Под невозможностью передачи через сообщения подразумевались собственные сообщения программ.
> Вариант 2.
> Использовать свои сообщения.



 
Skier ©   (2002-11-14 16:17) [20]

>han_malign
предполагается обмениваться с помощью WM_COPYDATA
оно всё сделает за нас :) см. MBo © (14.11.02 16:10)
про кастинг к Integer я наврал - давно WM_COPYDATA не пользовался...


 
AVD   (2002-11-15 08:40) [21]

FindWindow ("TFormGetData", "GetData");
А если у приложения нет формы ?
А если приложение это оле сервер ?
Вообщето смысл вот в чем:
Есть приложение оно будет работать всегда. Типа сервер.
Будут запускаться другие приложения эти приложнния будут использовать некий оле сервер который в свою очередь должен
подключиться к работающему в качестве сервера приложению
и обмениваться с ним данными в обоих направлениях.
???


 
AngeL B.   (2002-11-15 08:50) [22]

1) Общая память через отображения файлов

hFM = CreateFileMapping(INVALID_HANDLE_VALUE, ..., "имя отображения");

...

Тогда будет создано отображени части страничного файла.

2) Создать именованную трубу (CreateNamedPipe)

3) использовать вариант AVD


 
Александр Павлов ©   (2002-11-15 08:57) [23]

Как на счёт отображённых в пямять файлов?
FileOpen(),CreateFileMapping(),MapViewOfFile().


 
apay ©   (2002-11-15 10:01) [24]

мудрено что-то пишете... :)
просто надо создать глобальный атом (GlobalAddAtom), его передать ч/з SendMesage, во втором прил. получить его имя(GetAtomName) и удалить его (DeleteAtom).

Проще надо быть, и люди потянутся ... :)


 
Mute   (2002-11-15 10:43) [25]

А что мастера скажут о возможности передавать вариантные массивы через интерфейсы (при условии больших объемов данных)?


 
AVD   (2002-11-15 10:45) [26]

Спасибо всем! Благодаря вашим ответам я пришел
к однозначному выводу что лучьше и проще оле ничего не придумать.


 
AVD   (2002-11-15 10:50) [27]

Хотя всеже однозначно не понятно как посылать события от этого сервера...


 
gvb   (2002-11-15 11:27) [28]

Очень простой способ - использовать компоненты
NMMsg и NMMSGServ при этом строка пуляется на порт сервера,
правда без всякого контроля корректности.
Если нужен контроль - NMGeneralServer - и придумывай свой протокол обмена...


 
Fox ©   (2002-11-15 12:09) [29]

Ссылка по теме
http://www.pcmag.ru/archive/9708/089727.asp


 
Infinity ©   (2002-11-15 20:18) [30]

А почему бы не использовать сообщение 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 Можно передать и целую строку



Страницы: 1 вся ветка

Текущий архив: 2002.11.28;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.015 c
1-93118
Adam
2002-11-17 18:25
2002.11.28
Библиотека kernel32.dll


1-93136
MasterVovan
2002-11-17 06:51
2002.11.28
Проблемма с размером формы.


14-93237
Bboy tn
2002-11-10 00:19
2002.11.28
пересечение кругов


7-93272
max2057
2002-09-23 15:36
2002.11.28
Копирование файла в администр.ресурс


1-93028
Ильдар
2002-11-16 00:40
2002.11.28
При рисовании методами Canvas на форме происходит мерцание