2014-06-29 66 views
1

我正在尋找一種爲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; 
} 

相反卻使用定義​​的,我想允許用戶自己的代碼,然後插在其實現。

我從來沒有與插件實現的工作我自己,但到目前爲止,我已經能夠拿出一個插件界面如下可能性:

  1. 創建一個「迷你腳本語言」,這我的程序可以解析並創建一個過程管道,然後將這些變量傳遞到該管道中。這將涉及腳本語言中每個可能操作的很多「通用」函數。
  2. 使用預先存在的腳本語言用於相同的目的(但是這可能是不可能的,因爲我需要一些非常專業化的腳本功能)。
  3. 允許用戶編寫和編譯包含complexFunction(int, int)定義的C文件,並在運行時動態加載該文件。這是最不安全的選擇,但爲了開發目的,它將是理想的(僅)我會編寫自己的插件,並且可以動態地爲我的程序添加功能。

我的問題是雙重的:

  • 什麼是在應用程序中處理插件功能的方式嗎?
  • 我該如何完成(3)/is (3)甚至可能在C?在fopen之後,我可以以某種方式將它用作當前程序中的代碼嗎?

回答

1

腳本語言(通常是預先存在的類似lua或其他)是最常見的方式。 3是可能的 - 您可以在動態庫(.so或.dll文件)的預定義文件夾中查找並查找具有特定名稱的函數。它是可行的,但是它存在巨大的安全問題(你實際上沒有安全性)。

1

3)

如果用戶可以編譯你的函數成一個.dll,您可以使用以下步驟:
一)使用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; 
} 
+0

此答案是Windows特定的。 – rici