【问题标题】:Best way to implement plugin support实现插件支持的最佳方式
【发布时间】:2011-01-24 03:28:00
【问题描述】:

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

我即将打开软件进行外部 3 方开发。 但是使用 C 导出是为铁杆程序员准备的。

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

【问题讨论】:

    标签: c++ c plugins external


    【解决方案1】:

    我认为这实际上取决于节目的类型和您的目标受众。 WoW 肯定不会有那么多插件,因为它需要 C 和编译器来编写它们。但我肯定不想在 Lua 中编写大型插件。

    因此,首先您需要决定是使用脚本语言还是编译语言。如果您针对临时用户,那么脚本语言可能是更好的选择。如果您针对专业开发人员(例如,其插件由内部程序员开发的财务软件包),那么编译语言可能效果最好。

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

    【讨论】:

    • 感谢您的回答,但该软件将作为免费软件发布到主流。所以我还没有潜在的插件开发者,但我想让事情尽可能简单以吸引他们。
    • @bratao 如果你还没有开发人员,而且C接口已经做好了,那我就说先发布,再看看有多少需求对于任何其他插件环境。
    【解决方案2】:

    如果您有适合您的 C 导出编程示例,我建议您将先入为主的“硬核”概念搁置一旁,就像 Nike 所说的“就去做吧。”

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

    【讨论】:

    • 但我应该“吸引”开发人员加入该项目。对于 Sure C Export 来说,现在的开发人员并不适合。
    【解决方案3】:

    我们使用 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] 的文档以查看执行此类操作的跨平台库。

    【讨论】:

      【解决方案4】:

      想吸引人吗? JavaScript 很火。嵌入 v8 引擎。

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

      【讨论】:

        【解决方案5】:

        使用导出的 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++ 接口,又支持高度可编写脚本的插件接口,而且,如果有人喜欢不同的脚本,他们可以自己做。

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 1970-01-01
          • 2018-05-14
          • 2016-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多