Форум: "Основная";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
Вниз
Задачка.... Найти похожие ветки
← →
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 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.015 c