| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
Есть такая штука, называется 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, я слегка опоздал |
| Автор: baldina 4.4.2012, 22:06 |
| угу, пиши короче Добавлено через 2 минуты и 29 секунд |
| Автор: kami 4.4.2012, 22:19 |
| <offtopic> baldina, прикольно |
| Автор: BeeMaster 4.4.2012, 22:31 |
| Ребята... Помогите плиз. Покажите пожалуйста пример кода для взаимодействия. А то я никак не вкуриваю( Просто форма на нем edit1 и button. При нажатие на кнопку данные из edit1 передавались бы другому процессу. Нужен исходник... Заранее благодарен! |
| Автор: kami 4.4.2012, 23:13 | ||||
| Лови. Писалось в незапамятные времена для D7, на D2009+ придется подшаманить, могут быть утечки памяти, хотя, если память не изменяет - тестировал это. Использовать просто: в каждом приложении создать экземпляр TMMF с одним и тем же параметром в конструкторе и одинаковым максимальным размером MMF. Затем, на передающем конце:
на приемном конце:
|
| Автор: RelictOs 5.4.2012, 11:25 |
| Вот небольшое клиент-серверное приложение на Socket. на мой взгляд - наиболее простой пример. реализована передача текста и файлов. |
| Автор: kami 5.4.2012, 12:40 |
Некорректная работа с сокетами, увы |
| Автор: Чучмек 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 Например:
Из ***_TLB копируешь описание интерфейса IMyClass и константу CLASS_MyClass В клиенте:
Вот пример. |