Использование EXE вместо DLL в качестве плагинов - способы передачи информации «в один конец, один раз» - PullRequest
1 голос
/ 20 декабря 2011

tldr;внизу.

Итак, еще раз интересная проблема, и я ищу интересное и интересное решение.

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

Итак, я начал с типичного маршрута, который использует плагины DLL.Теперь это просто нормальный путь, я хочу немного нестандартно мыслить.

Модули, включенные в мою программу, - это длительные кампании, на завершение которых могут потребоваться недели, и их будет много одновременно.Так что стабильность - большая проблема, поэтому я подумал о том, что делает Google Chrome.Процессы, а не библиотеки DLL или потоки.

Итак, у меня есть среда разработки, и мне нужен способ получить некоторую информацию о каждом модуле (который теперь является EXE-файлом).Теперь для моей библиотеки DLL я экспортировал функцию «Регистрация», которая заполнила бы некоторую информацию.

Итак, я подумал: эй, EXE могут экспортировать функции, посмотрим, работает ли это на самом деле ... Это не так.Я провел некоторое исследование того, как Windows обрабатывает эти вещи, и мне не хочется взламывать PE-заголовки на лету (но я думаю, что это нестандартное мышление).

I 'Планирование использования именованных каналов и параметров CLI для передачи данных между основной программой и exe-файлами модуля.Я мог бы использовать это в качестве регистра, но я хочу здесь мысли других людей.

tldr: я использую EXE вместо DLL для плагинов.Ищите способ легко экспортировать одноразовую информацию, как экспортированная функция «Регистрация» в DLL.Мысли

Ответы [ 4 ]

5 голосов
/ 20 декабря 2011

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

Таким образом, все еще легко определить и экспортировать набор API, которые должны быть предоставлены, но все же запустить его как отдельный процесс.Один исполняемый файл, который вы пишете, может загрузить указанную DLL и затем обработать необходимый IPC с основным приложением.

1 голос
/ 20 декабря 2011

Вы можете определить протокол через stdin / stdout, именованные каналы, сокеты и т. Д.

0 голосов
/ 21 декабря 2011

Вы, конечно, не можете использовать символы, экспортированные exe-файлом, так как он работает в другой границе. Но вы можете загрузить exe-файл как изображение (как вы это сделали бы с библиотекой), используя LoadLibrary (Ex), а затем использовать функции, экспортированные exe-файлом. Я тестировал (просто для удовольствия) при отладке PeStudio. См. Снимок ниже chrome.exe, загруженного в пространство процесса PeStudio.exe с использованием LoadLibrary.

enter image description here

0 голосов
/ 20 декабря 2011

Я успешно использовал «обычный» COM для нескольких проектов и объектов, наследуемых от TAutoObject.Бонусы здесь IDL;возможность взаимодействия с .Net, VBA и другими не-Delphi вещами;и тот факт, что разработчики по-прежнему могут выбирать, предоставлять ли DLL, exe-файл, NT-сервис и, при желании, работать в сети (COM + / DCOM).Может быть несколько соображений по поводу многопоточности и блокировки, но я нашел все, что мне нужно было знать в Интернете.

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