Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-93183
VEG
2002-11-08 16:26
2002.11.28
Че за хрень?


14-93221
McSimm
2002-11-08 16:15
2002.11.28
вот, вспомнилось...


14-93236
Ajax
2002-11-10 12:06
2002.11.28
Программы распознавания текста по голосу...


14-93256
Snake2000
2002-11-07 12:32
2002.11.28
---|Ветка была без названия|---


3-92866
Novishok
2002-11-07 13:59
2002.11.28
Секс!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский