我正在寻找一种为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;
}
不是使用定义的complexFunction
,而是希望允许用户编写自己的代码,然后插入他们的实现。
我自己从未使用过插件实现,但到目前为止,我已经能够为插件接口提供以下可能性:
complexFunction(int, int)
定义的C文件,并在运行时动态加载该文件。这是最不安全的选项,但出于开发目的,它将是理想的(仅)我将创建自己的插件,我可以动态地为我的程序添加功能。我的问题有两个:
fopen
文件之后,我可以以某种方式将其用作当前程序中的代码吗?答案 0 :(得分:1)
脚本语言(通常是像lua之类的预先存在的语言)是最常见的方式。 3是可能的 - 您可以在预定义的文件夹中查找动态库(.so或.dll文件)并查找具有特定名称的函数。它可行,但它存在巨大的安全问题(你实际上没有安全性)。
答案 1 :(得分:1)
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;
}