Вопрос

У меня есть 2 настольных приложения, которые я хочу интегрировать с внешними приложениями.Одно из приложений дополнено плагинами, разработанными мной, для предоставления специфических функций, которые не являются общими для всех дистрибутивов.Ситуация может быть описана на следующей диаграмме:

альтернативный текст http://img32.imageshack.us/img32/8902/integration1.png

Как я уже упоминал, я хочу интегрировать (получать и отправлять данные) свои приложения с внешними приложениями или SDK.Обычно существует 2 типа данных из внешних приложений:

  1. Общие /Common data - которые всегда актуальны
  2. Конкретные данные, которые должны обрабатываться по-разному для каждого внешнего приложения

С "Основным приложением" желаемая ситуация может быть описана на этой диаграмме:

альтернативный текст http://img32.imageshack.us/img32/3299/integration2.png

Общие данные обрабатываются в основном приложении, а конкретные данные обрабатываются в плагинах (support plugins).

Распространение этого приложения может быть одним из

  • Основное приложение + Приложение Yakko + Интегратор приложений Yakko + Плагин поддержки приложений Yakko
  • Основное приложение + Точечное приложение + Интегратор точечных приложений

Для другого приложения я хочу сохранить те же "Интеграторы", но обрабатывать их по-разному внутри приложения:

альтернативный текст http://img32.imageshack.us/img32/2088/integration3x.png

Как бы вы порекомендовали реализовать поддержку в моих приложениях для интеграции внешних приложений и SDK, как я только что описал?

Примечания:

  • Я использую C ++ в Windows, и плагины распространяются в виде DLL.
  • Типы данных, которые будут использоваться, всегда известны заранее, мне просто нужен какой-то общий способ переместить их из источника в обработчик.
Это было полезно?

Решение

Я согласен с комментатором, COM кажется хорошей стратегией.Ваши библиотеки DLL поддержки регистрируются при их установке, затем ваше основное приложение может искать плагины, что-то вроде:

hr = CLSIDFromProgID(L"Wakko.1.0", &clsid);  
hr = GetActiveObject(clsid, NULL, &punk);

или
hr = CoCreateInstance(clsid, ...,..., IID_IWAKKO, ...);

Другие советы

Посмотрите на параметры IPC, которые есть в Windows здесь

Для меня также COM выглядит здесь хорошим вариантом.

Другим способом сделать это было бы запустить ваше основное приложение на сервере, который прослушивает вызовы из ваших плагинов.Вы можете достичь этого, используя каналы имен.Теперь ваши приложения поддержки будут использовать эти плагины для связи (по именованным каналам) с вашим основным приложением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top