实现插件支持的最佳方式

时间:2011-01-24 03:28:01

标签: c++ c plugins external

我在c ++ MFC中有一个软件,它有一些使用C导出的插件公共接口。

我即将打开外部3方开发软件。 但是使用C导出是针对硬核程序员的。

实施它的最佳方法是什么?我听说过LUA,但想了解其他可能性。

5 个答案:

答案 0 :(得分:3)

我认为这实际上取决于计划类型和目标受众。哇肯定不会有它需要C和编译器来编写它们的插件。但我肯定不想在Lua写一个大插件。

因此,在做任何其他事情之前,您需要决定是否要使用脚本语言或编译语言。如果您针对临时用户,那么脚本语言可能是更好的选择。如果您的目标是专业开发人员(例如,其插件由内部程序员开发的财务包),那么编译语言可能效果最佳。

哦,还有 - 为什么不问一堆潜在的插件开发者?

答案 1 :(得分:0)

如果您有适合您的C导出编程示例,我建议您将预先设想的“硬核”概念放在一边,并且耐克说“只是这样做。”

这可能比你预期的要容易。

答案 2 :(得分:0)

我们使用c命名约定和dlopen\LoadLibrary系列函数来加载插件(.dll或.so),找到所需的3个方法(create_plugin()destroy_plugin(),和get_type()

插件实现者只需要确保库中的等效物(使用他们使用的任何语言)是可见的

extern "C" PLUGIN_API plugin_interface* create_plugin( arg_pack* );
extern "C" PLUGIN_API void destroy_plugin( plugin_interface* );
extern "C" PLUGIN_API const char* get_type();

根据插件的需要,可以使用特定参数替换arg_pack。

查看[gmodule][1]的文档,查看跨平台库来执行此类操作。

答案 3 :(得分:0)

想吸引大家? JavaScript很热门。嵌入v8引擎。

http://code.google.com/apis/v8/embed.html

答案 4 :(得分:0)

使用导出的C函数实现二进制接口以创建和返回接口。

// your_plugin_header

// Plugins must implement this interface
struct PluginInterface {
  virtual void Release()=0;
  virtual void Method()=0;
  virtual void Method2()=0;
};


// Plugin dll's must export this function that creates a new object that implements
// the PluginInterface;
extern "C" bool CreatePluginObject(PluginInterface**);

然后,将一个示例插件实现为Lua / Javascript / Python桥接器,并将其与您的软件捆绑在一起。开箱即用,你支持紧密耦合的C ++接口,PLUS高度可编写脚本的插件接口,如果有人喜欢不同的脚本,他们可以自己做。