Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передача информации между двумя и более exe


Автор: BeeMaster 4.4.2012, 19:15
В общем задача. Есть главное приложение которое должно принимать общую статистику о работе. И вторичные приложения которые будут работать и передавать информацию полученную главному ехе. Нужно именно так т.к. это связано с особенностями выполняемой задачи.

Была мысль создать свое API для функционирования приложений наподобие как это реализовано у скайпа, но так и не нашел как это сделать.

Передача информации с помощью файлов... Вариант но слишком часто будут сохраняться файлы и считываться... В общем боюсь что повлияет на работоспособность машины в целом...


Подскажите пожалуйста как реализовать. Желательно с примером

Автор: baldina 4.4.2012, 21:57
http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5

Автор: kami 4.4.2012, 22:01
Цитата(BeeMaster @  4.4.2012,  19:15 Найти цитируемый пост)
Подскажите пожалуйста как реализовать.

Есть такая штука, называется IPC - "межпроцессное взаимодействие".
Способов куча:
1. Post|SendMessage - обычно используется для небольших объемов данных, которые "влезают" в 2 integer числа.
2. MemoryMappedFiles (MMF) - не особо просто обеспечить синхронизацию записи/чтения.
3. NamedPipes - наиболее применимо для обмена информацией в пределах одного компьютера. На Vista и Win7 появились подводные камни, связанные с различием прав доступа: к примеру, нельзя просто так подключиться к именованному каналу, если один из процессов запущен от системной учетки (например, служба), а второй - как обычное десктопное приложение, нужно поиграться с правами доступа
4. Sockets. Наиболее универсальное решение, но в пределах одного компьютера - избыточное.

Наверняка перечислил не всё, гугл на запрос IPC скажет гораздо больше.

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

Автор: baldina 4.4.2012, 22:03
http://www.delphi-central.com/ipc_sendmessage.aspx
хотя имхо это не самый удобный способ. чем Вам файлы не угодили? см. CreateNamedPipe()

Автор: kami 4.4.2012, 22:03
baldina,  я слегка опоздал smile

Автор: baldina 4.4.2012, 22:06
угу, пиши короче  smile

Добавлено через 2 минуты и 29 секунд
 smile kami, не поверишь. у нас с тобой ДР совпадают.  smile 

Автор: kami 4.4.2012, 22:19
<offtopic> baldina, прикольно smile </off topic>

Автор: BeeMaster 4.4.2012, 22:31
Ребята... Помогите плиз. Покажите пожалуйста пример кода для взаимодействия. А то я никак не вкуриваю(



Просто форма на нем edit1 и button. При нажатие на кнопку данные из edit1 передавались бы другому процессу. Нужен исходник...

Заранее благодарен!


Автор: kami 4.4.2012, 23:13
Лови.
Писалось в незапамятные времена для D7, на D2009+ придется подшаманить, могут быть утечки памяти, хотя, если память не изменяет - тестировал это.

Использовать просто:
в каждом приложении создать экземпляр TMMF с одним и тем же параметром в конструкторе и одинаковым максимальным размером MMF.

Затем, на передающем конце:
Код

myMMF.SyncAddData(edit1.text[1], Length(edit1.text));


на приемном конце:
Код

var
  myData: TMMFData;

myMMF.SyncGetAllData(myData);
if myData.DataCount>0 then
  edit1.text:=myData.Data[0];

Автор: RelictOs 5.4.2012, 11:25
Вот небольшое клиент-серверное приложение на Socket. на мой взгляд - наиболее простой пример.
реализована передача текста и файлов.

Автор: kami 5.4.2012, 12:40
Цитата(RelictOs @  5.4.2012,  11:25 Найти цитируемый пост)
наиболее простой пример.

Некорректная работа с сокетами, увы

Автор: Чучмек 5.4.2012, 13:07
Ну не стоит забывать про такую замечательную вещь как COM
Создаешь COM сервер
File->New->Other->ActiveX->COM Object

"Class Name":MyClass
"Instancing":Multiple Instance
"Threading Model":Apartament
check "Include Type Library" and "Mark interface Oleautomation"
OK

Выделяешь IMyClass
Нажимаешь NewMethod
На вкладке Attributes задаешь имя метода 
Name:MyFunc
На вкладке Parameters добавляешь передаваемые параметры и  задаешь тип.
"Name":str  "Type":BSTR  "Modifier":[in]
Нажимаешь обновить "Refresh Iplementation"
В проект добавится два модуля Unit* и ***_TLB
В Unit* пишешь реализацию  MyFunc
Например:
Код

function TMyClass.MyFunc(const str: WideString): HResult;
begin
unit1.Form1.Memo1.Lines.Add(str);
end;
 
Из ***_TLB копируешь описание интерфейса IMyClass
и константу CLASS_MyClass

В клиенте:
Код

type
 IMyClass = interface(IUnknown)
    ['{1331A90D-7D30-49E5-8C56-9803C2337621}']
    function MyFunc(const str: WideString): HResult; stdcall;
  end;
const CLASS_MyClass: TGUID = '{6D01482C-F601-45C7-8AA5-DC992137B5FA}';


var myclass:IMyClass;

...
myclass:=comobj.CreateComObject(CLASS_MyClass)as IMyClass;
...

myclass.MyFunc('Прувэт');



Вот пример.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)