编写可插入应用程序的最佳方法是什么?

时间:2011-11-26 06:36:13

标签: c++ plugins

我想编写一个可以使用插件扩展的本机应用程序,完全以动态库的形式。我知道该怎么做,但我想要一些想法,特别是关于做什么和不做的最佳实践提示。我在java和php上使用类似的东西,所以我希望我不会给我的C ++带来任何坏习惯。

我正在考虑允许开发人员实现某些功能,如“on_recieve_data(App * app,void * data)”,我的应用程序将加载所有插件并使用指向自身的指针(dlsym?)调用他们的on_recieve_data函数。

3 个答案:

答案 0 :(得分:16)

我认为有些内容对插件非常重要:

  • 语言支持

如果你想要获得最多的平台/语言/编译器,那么你应该用C编写插件接口,而不是用C ++编写。插件开发人员仍然可以用C ++编写他们的函数,当然,它只是C的接口。问题是每个C ++编译器都以自己的方式破坏符号名称,所以如果你使用C ++,你将强迫插件开发者使用您使用的相同编译器和工具。另一方面,只有一种方法可以导出C符号,因此使用插件的C接口将允许开发人员选择他们喜欢的任何工具,只要他们可以生成标准的.so / .dll库,他们就会没事。

  • 内存分配

在某些平台上,当应用程序分配的内存由DLL释放或反之时会出现问题。如果插件具有应该分配内存的功能,那么请确保您还需要插件提供相应的功能来释放该内存。同样,如果插件可以调用应用程序中的一个函数来分配内存,那么还应该为该内存公开一个释放函数。

  • 版本

在插件编写完成后,您可能需要修改插件API。因此,您的应用程序需要准备好加载为旧版本开发的插件。您应该在应用程序调用的插件中需要一个'init'函数来确定插件实现的API版本以及应用程序可能需要知道的任何其他信息,例如插件类型(如果有不同的类型),什么是实施,什么不是,等等。

当你必须修改插件API时,你必须非常小心。您无法更改现有功能,因为这会破坏旧插件。相反,您需要添加具有这些改进的那些功能的替代版本。然后问题是如何命名现有函数的新版本。通常他们会得到相同的名称加上一些后缀('Ex',数字等)。我没有看到这个问题以我喜欢的方式解决。

同样,您必须对应用程序和插件之间传递的结构采取预防措施。一种常见的方法是使所有结构的第一个成员具有结构的大小。这可以作为一种版本控制机制,以便应用程序可以根据其大小确定结构的外观。

以下是一些可能感兴趣的链接:

  • C-Pluff,C中的通用插件框架(MIT许可证)
  • lighttpd的plugin.h标头文件
  • This page讨论了如何在Mac OS X下实现插件架构,包括如何为插件创建C接口的简短概述。
  • Blender是一个有趣的。该应用程序是用C ++编写的,但插件是用Python编写的。这真是个坏主意,它使开发人员更容易编写插件。

有很多用脚本语言编写的应用程序支持插件(Wordpress,Drupal,Django等等)。您可以查看任何更接近您正在撰写的应用程序类型的内容。

答案 1 :(得分:1)

我相信这篇文章 - >我猜Design Pattern for implementing plugins in your application?确实回答了你的问题。它有很多参考插件模型。

答案 2 :(得分:0)

Perhapse,Eclipse架构可以作为示例: http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html

我很漂亮有一本来自Eclipse创作者的书,但我既不记得作者也不记得这本书的名字。