Как создать интерфейс плагина для программы на C

#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 я хотел бы разрешить пользователю создавать свои собственные, а затем подключать их реализацию.

Я сам никогда не работал с реализациями плагинов, но до сих пор я смог предложить следующие возможности для интерфейса плагина:

  1. Создайте «мини-язык сценариев», который моя программа может анализировать и создавать конвейер процедур, а затем передавать переменные в этот конвейер. Это потребовало бы множества «общих» функций для каждого возможного действия на языке сценариев.
  2. Используйте уже существующий язык сценариев для той же цели (однако это может оказаться невозможным, поскольку мне понадобятся некоторые очень специализированные скриптовые функции).
  3. Разрешить пользователю писать и компилировать файл 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.