2009-05-25 2 views
6

Мне нужно, чтобы некоторые из моих связанных приложений связывались друг с другом (обменивались данными и инициировали действия). Требования не имеют пакетов и нет сокетов. Таким образом, я предполагаю, что оставляет именованные каналы, WM_CopyData (например, Skype) и параметры команды. Каковы ваши лучшие практики?Каков наилучший способ обмена данными приложений в Delphi без сокетов?

+0

Если я выберу именованные каналы или WM_CopyData, тогда я поеду с REMObjects SDK, поэтому, пожалуйста, не отвечайте на это. Благодарю. – Mihaela

+0

Вы не ищете шаблон дизайна, вы ищете технологию. –

+0

Вы правы. Я думал о шаблоне дизайна, но мой вопрос просто сосредоточился на технологии. Модель проектирования будет включать уже выбранную технологию и ее реализацию. Спасибо, что исправили это. – Mihaela

ответ

5

Возможно, у вас есть несколько вариантов.

Помимо того, что у вас уже есть:
DDE
файлы, отображенные на память (MMF)

почтовые слоты

я бы, вероятно, пойти либо с трубами или ММФ.

Есть несколько бесплатных MMF-компонентов, которые вы можете скачать, В Deborah Pate есть набор бесплатных классов, которые вы можете использовать. MapFiles.zip

Проверка на MailSlots на сайте Torry's.

Окончательное решение может зависеть от количества, размера и частоты передачи данных, которые определяют, какой вариант вы выберете.

4

В этой ситуации я бы посоветовал использовать COM. (Внимание: не COM +, а не ActiveX, а не OLE; COM, просто COM.)

Поскольку Delphi 7 (или более ранняя версия, я не уверен), это легко сделать, добавив библиотеку типов в проект , и объект автоматизации.

Достоинствами являются довольно широко поддерживаемые, как в Delphi (редактор библиотеки типов имеет все необходимое и обновляет ваш код, а внутренние COM-объекты и регистрация обслуживаются из модуля ComServ) и вне Delphi (я использую его в ряде проектов для взаимодействия со всеми видами приложений: проекты на C++, документы Word и Excel с использованием VBA, oldskool ASP ...).

Единственный недостаток, с которым я столкнулся, может представлять проблемы с потоками, в обычных приложениях простой CoInitialize(nil); при запуске приложения будет работать в более сложных приложениях, вам нужно подумать о «поточных квартирах» или использовать свободную резьбу и сделать свою собственную блокировку , (Что в некоторых случаях вы уже делаете.)

+0

Обратите внимание, что CoInitialize() и CoUninitialize() необходимо вызывать в каждом потоке, который использует COM. – mghie

+0

Это хороший ответ, я предпочитаю не использовать COM. – Mihaela

+0

Как раз упомянуть, что простое создание COM-объектов было доступно с Delphi 3. –

0

Не используйте COM слишком много служебных (вариантов), и вы должны зарегистрировать вас .dll или .exe (и это дает много странных проблем с установкой + обновления).

Мне нужно использовать MMF, я использую его для связи с Windows Services. Я использую следующие TGpMessageQueueReader и писатель для этого: http://17slon.com/gp/gp/gpsync.htm

+0

Я рассматриваю это как преимущество: с обычными объектами автоматизации, обработкой ComServ является регистрация для вас, и если вы хотите, вы можете использовать производный объект из TAutoObjectFactory , вы можете добавить к методу UpdateRegistry. (Я отредактировал свой ответ, чтобы упомянуть об этом) –

+0

Кроме того, я использую такие родные типы, как BSTR (который хорошо рисует для WideString в коде) и числовые значения, которые прекрасно выполняются и не имеют проблем с вариантами. (Я никогда не испытывал никаких проблем с OleVariants в любом случае, о чем вы говорите?) –

2

Другой альтернативой, которая является грязь легко осуществить, чтобы использовать базу данных для передачи информации.

Не слишком изящный, и он использует много накладных расходов, но если ваше приложение уже осведомлено о данных (т. Е. Имеет базу данных как часть его), то использование таблицы или двух для передачи информации довольно просто.

2

Вы можете использовать простые файлы: одна сторона пишет на нее, другая читает. Если вам нужна двусторонняя связь, просто используйте два файла, по одному для каждого направления.

Конечно, это не очень высокая производительность.

+0

+1 Связь через файлы может оказаться очень удобной раз и навсегда. Это простой способ общения между различными операционными системами, каждый язык программирования/сценариев поддерживает его, и это один из немногих методов, когда информация не теряется, если читатель умирает. Запись файлов с датой + временем в нем может заставить работать как очередь или стек, в зависимости от того, что вы хотите. Он отлично работает, если вы не отправляете сотни сообщений в секунду, или если каждый микросекунда считается. –

0

Разве это не похоже на то, что RemObjects хорошо? Bri

1

Еще один голос от меня для именованных труб, для обмена данными. Мне они нравятся немного больше, чем файлы mmap, так как API-интерфейсы win32 предоставляют вам несколько хороших вариантов: sync/async, поток байтов и пакетов сообщений, простые вызовы ReadFile/WriteFile. Все из которых вы можете сделать сами с mmaps ... но трубы уже есть ...

И вы можете контролировать доступ с помощью атрибутов безопасности - это не опция с WM_CopyData. Это может быть не проблема сразу ... но может быть удобно иметь эту опцию, даже если вам все равно, кто отправляет ваши сообщения приложений. Для меня это было полезно, когда появилась Vista, и внезапно пользовательские приложения запустили отдельный сеанс моей службы. Было хорошо, что настройка атрибутов безопасности была единственной вещью, необходимой для того, чтобы все снова работало.

Для «инициирующих действий» вы можете уйти с чем-то легким, как некоторые из названных событий, и не беспокоиться о отправке сообщений вообще? Заинтересованные стороны просто ждут, когда это будет сигнализировано.

Лично я бы избежал COM, если вам не нужно специально поддерживать COM-клиенты.

0

Если вы хотите передавать данные, вызывать функции и т. Д., Тогда используйте COM, однако, если есть много вызовов, имейте в виду, что COM работает медленно. Возможно, вам придется зарегистрировать приложение с помощью «xxx.exe/Regserver», прежде чем он будет работать.

Смежные вопросы