【发布时间】:2011-01-24 03:28:00
【问题描述】:
我在 c++ MFC 中有一个软件,它有一些使用 C 导出的插件的公共接口。
我即将打开软件进行外部 3 方开发。 但是使用 C 导出是为铁杆程序员准备的。
实现它的最佳方法是什么?我听说过 LUA,但想了解其他可能性。
【问题讨论】:
我在 c++ MFC 中有一个软件,它有一些使用 C 导出的插件的公共接口。
我即将打开软件进行外部 3 方开发。 但是使用 C 导出是为铁杆程序员准备的。
实现它的最佳方法是什么?我听说过 LUA,但想了解其他可能性。
【问题讨论】:
我认为这实际上取决于节目的类型和您的目标受众。 WoW 肯定不会有那么多插件,因为它需要 C 和编译器来编写它们。但我肯定不想在 Lua 中编写大型插件。
因此,首先您需要决定是使用脚本语言还是编译语言。如果您针对临时用户,那么脚本语言可能是更好的选择。如果您针对专业开发人员(例如,其插件由内部程序员开发的财务软件包),那么编译语言可能效果最好。
哦,还有 - 你为什么不问问一群潜在的插件开发者?
【讨论】:
如果您有适合您的 C 导出编程示例,我建议您将先入为主的“硬核”概念搁置一旁,就像 Nike 所说的“就去做吧。”
这可能比您预期的要容易。
【讨论】:
我们使用 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] 的文档以查看执行此类操作的跨平台库。
【讨论】:
想吸引人吗? JavaScript 很火。嵌入 v8 引擎。
【讨论】:
使用导出的 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++ 接口,又支持高度可编写脚本的插件接口,而且,如果有人喜欢不同的脚本,他们可以自己做。
【讨论】: