#c #plugins
#c #Плагины
Вопрос:
Я ищу способ создать интерфейс плагина для программы на C. В интересах краткого и краткого примера, допустим, у меня есть следующая программа:
#include <stdio.h>
int complexFunction(int a, int b) { return a b; }
int main() {
int a = 3;
int b = 6;
printf("The result of C(a, b) is %d.n", complexFunction(a, b));
return 0;
}
Однако вместо использования defined complexFunction
я хотел бы разрешить пользователю создавать свои собственные, а затем подключать их реализацию.
Я сам никогда не работал с реализациями плагинов, но до сих пор я смог предложить следующие возможности для интерфейса плагина:
- Создайте «мини-язык сценариев», который моя программа может анализировать и создавать конвейер процедур, а затем передавать переменные в этот конвейер. Это потребовало бы множества «общих» функций для каждого возможного действия на языке сценариев.
- Используйте уже существующий язык сценариев для той же цели (однако это может оказаться невозможным, поскольку мне понадобятся некоторые очень специализированные скриптовые функции).
- Разрешить пользователю писать и компилировать файл C, содержащий определение
complexFunction(int, int)
, и динамически загружать его во время выполнения. Это наименее безопасный вариант, но для целей разработки он был бы идеальным как (только) Я бы создал свои собственные плагины, и я мог бы динамически добавлять функциональность в свою программу.
Мой вопрос двоякий:
- Каковы общие способы обработки возможностей плагина в приложениях?
- Как я могу выполнить (3) / возможно ли вообще (3) на C?
fopen
Могу ли я после создания файла каким-либо образом использовать его в качестве кода в текущей программе?
Ответ №1:
Язык сценариев (обычно уже существующий, например, lua или что-то в этом роде) является наиболее распространенным способом. возможно 3 — вы можете посмотреть в предопределенной папке динамические библиотеки (файлы .so или .dll) и искать функции с определенными именами. Это выполнимо, но с этим связаны огромные проблемы с безопасностью (на самом деле у вас нет безопасности).
Ответ №2:
3)
Если пользователь может скомпилировать вашу функцию в .dll, вы можете использовать следующие шаги:
a) использовать LoadLibrary для загрузки dll
b) использовать GetProcAddress для получения адреса функции
c) выполнить функцию
Пример:
typedef int (__cdecl *PCF)(int, int);
HMODULE hDll = LoadLibrary("x:\Dllpath\MyPlugIn.dll");
if (hDll != NULL)
{ PCF pfnComplexFunction = GetProcAddress(hDll, "complexFunction");
if (pfnComplexFunction != NULL)
{ int a = 3;
int b = 6;
printf("The result of C(a, b) is %d.n", pfnComplexFunction(a, b));
}
FreeLibrary(hDll);
}
Функция в dll должна быть объявлена как
__declspec(dllexport) int __cdecl complexFunction(int a, int b)
{ return a b;
}
Комментарии:
1. Этот ответ зависит от Windows.