Вниз
Скачать: 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]

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


← →
k ©   (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 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.013 c
1-93121
Cker
2002-11-18 00:41
2002.11.28
Отображение Unicode в разных компонентах...


14-93210
RV
2002-11-10 09:41
2002.11.28
Как вы думаете?


14-93182
[NIKEL]
2002-11-08 18:35
2002.11.28
Куда можно выложить утилитку?


3-92941
Alexandr1
2002-11-06 10:11
2002.11.28
Фильтрация по дате (месяцу)


3-92874
Dbrf
2002-11-10 13:51
2002.11.28
Присвоение значения части даты




   Наверх