我在c ++ MFC中有一个软件,它有一些使用C导出的插件公共接口。
我即将打开外部3方开发软件。 但是使用C导出是针对硬核程序员的。
实施它的最佳方法是什么?我听说过LUA,但想了解其他可能性。
答案 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引擎。
答案 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高度可编写脚本的插件接口,如果有人喜欢不同的脚本,他们可以自己做。