2012-06-02 2 views
0

Мне было интересно, есть ли способ сделать что-то вроде плагина на Java, поэтому основная программа загружает подпрограммы и выполняет их функции. Я думал о наборе небольших программ, которые возвращают какое-то значение, но я хочу, чтобы плагины могли модифицировать некоторые из основных программных объектов (возможно, как-нибудь передать указатель?).Плагины в Cpp - Выполнение внешних программных функций

Есть ли способ сделать это?

Thanx для любых ответов.

ответ

1

Можно динамически загружать код во время выполнения в виде динамически связанных библиотек (DLL: s в Windows).

подход (при работе с Windows, по крайней мере) я использую об этом:

  • Создание библиотеки DLL с некоторыми экспортируемые функции (объявленный с __declspec (dllexport))
  • Загрузите созданный файл при пробеге -time с функцией LoadLibrary в Windows-API
  • Получить функцию-указатель на функцию-член по имени с помощью функции GetProcAddress-function, используя имя функции.

Последняя часть может быть немного запутанной, поскольку C++ использует переключение имен для отслеживания типов возвращаемых данных и таких вещей. Это означает, что имя, хранящееся в DLL, не является именем функции, но имя также содержит описания типов параметров функции и таких вещей.

Чтобы предотвратить имя-коверкая, вы можете объявить экспортируемые функции с экстерном «C», такие как

extern "C" __declspec(dllexport) int myFunction(...); 

Однако это не позволит классов в объявлении функции.

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

Опять же, это, вероятно, зависит от Windows, но это может дать вам намек на правильную процедуру в вашей системе.

+0

Любой способ для не-окон? –

+0

Это то же самое на всех платформах, в основном: используйте «C», а не C++, плагины не могут выкидывать исключения, выписывать классы и их методы явно как структуры и функции с помощью указателей на них и т. Д. , dlopen (или LoadLibrary) загружает файл в адресное пространство, а dlsym (или GetProcAddress) ищет в списке экспортированных символов указатели на объекты. Очень аккуратный и понятный, более, чем язык, такой как Java! –

+0

Подождите, вы имеете в виду, если я использую DLL, я также могу использовать его в Linux, и я могу изменить основные классы пользовательских классов из плагина? –

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