如何为C程序创建插件接口

时间:2014-06-29 06:25:09

标签: c plugins

我正在寻找一种为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,而是希望允许用户编写自己的代码,然后插入他们的实现。

我自己从未使用过插件实现,但到目前为止,我已经能够为插件接口提供以下可能性:

  1. 创建一个'迷你脚本语言',我的程序可以解析并创建一个过程管道,然后将变量传递给该管道。这将涉及脚本语言中每个可能操作的许多“通用”函数。
  2. 为了相同的目的使用预先存在的脚本语言(但是这可能是不可能的,因为我需要一些非常专业的脚本化函数)。
  3. 允许用户编写和编译包含complexFunction(int, int)定义的C文件,并在运行时动态加载该文件。这是最不安全的选项,但出于开发目的,它将是理想的(仅)我将创建自己的插件,我可以动态地为我的程序添加功能。
  4. 我的问题有两个:

    • 在应用程序中处理插件功能的常用方法是什么?
    • 如何在C中完成(3) / (3)?在fopen文件之后,我可以以某种方式将其用作当前程序中的代码吗?

2 个答案:

答案 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;
}