Я работаю над большой базой кода для настольного приложения Windows, написанного на C++.
Много лет назад моя компания заплатила лицензионный сбор гораздо более крупной компании за использование компонента, встроенного в наше программное обеспечение и предоставляющего критически важные услуги. Компонент представляет собой двоичный BLOB-объект с некоторыми файлами заголовков и был скомпилирован с использованием среды выполнения VS2008.
В результате сейчас все приложение зависит от среды выполнения VS2008. Мы не можем перейти на современный C++ или более новые версии используемых нами библиотек (например, мы застряли на Qt4, а не на Qt5). По разным причинам маловероятно, что указанная компания когда-либо предоставит обновленные BLOB-объекты, и, хотя мы планируем написать собственную замену, это займет много времени.
Тем временем я хотел бы каким-то образом обернуть этот компонент и изолировать его, чтобы мы могли обновить остальную часть нашего кода до более поздней среды выполнения и общаться с ним с помощью JSON или аналогичного. Потенциально в какой-то момент в будущем мы можем заменить компонент чем-то собственным (или чем-то с открытым исходным кодом), вообще не написанным на C++.
Я могу придумать несколько способов сделать это, но я не уверен, какой из них лучше и что даст нам наибольшую гибкость в будущем. Читая о COM, кажется, что это была та самая цель, для которой он был создан, но я не знаю, активно ли COM все еще разрабатывается и поддерживается, и привяжет ли он нас навсегда к экосистеме Windows. DCOM — это версия, отличная от Windows, но, во всяком случае, она кажется еще более заброшенной.
Я заинтересован в любых предложениях относительно наилучшего способа продолжить. Пока мои идеи таковы:
- Очень тщательно спроектируйте DLL (которая может работать или не работать, я не могу сказать по Как мне создать независимую от версии среды выполнения DLL на C++?, но похоже, что это будет неоптимально)
- Используйте COM (см. оговорки выше)
- Запускать как отдельный процесс и передавать данные через cin и cout (ограничено текстовыми данными и может быть медленным?)
- Запустите как отдельный процесс и запустите простые отношения клиент/сервер (кажется тяжеловесным)