我想编写一个可以使用插件扩展的本机应用程序,完全以动态库的形式。我知道该怎么做,但我想要一些想法,特别是关于做什么和不做的最佳实践提示。我在java和php上使用类似的东西,所以我希望我不会给我的C ++带来任何坏习惯。
我正在考虑允许开发人员实现某些功能,如“on_recieve_data(App * app,void * data)”,我的应用程序将加载所有插件并使用指向自身的指针(dlsym?)调用他们的on_recieve_data函数。
答案 0 :(得分:16)
我认为有些内容对插件非常重要:
如果你想要获得最多的平台/语言/编译器,那么你应该用C编写插件接口,而不是用C ++编写。插件开发人员仍然可以用C ++编写他们的函数,当然,它只是C的接口。问题是每个C ++编译器都以自己的方式破坏符号名称,所以如果你使用C ++,你将强迫插件开发者使用您使用的相同编译器和工具。另一方面,只有一种方法可以导出C符号,因此使用插件的C接口将允许开发人员选择他们喜欢的任何工具,只要他们可以生成标准的.so / .dll库,他们就会没事。
在某些平台上,当应用程序分配的内存由DLL释放或反之时会出现问题。如果插件具有应该分配内存的功能,那么请确保您还需要插件提供相应的功能来释放该内存。同样,如果插件可以调用应用程序中的一个函数来分配内存,那么还应该为该内存公开一个释放函数。
在插件编写完成后,您可能需要修改插件API。因此,您的应用程序需要准备好加载为旧版本开发的插件。您应该在应用程序调用的插件中需要一个'init'函数来确定插件实现的API版本以及应用程序可能需要知道的任何其他信息,例如插件类型(如果有不同的类型),什么是实施,什么不是,等等。
当你必须修改插件API时,你必须非常小心。您无法更改现有功能,因为这会破坏旧插件。相反,您需要添加具有这些改进的那些功能的替代版本。然后问题是如何命名现有函数的新版本。通常他们会得到相同的名称加上一些后缀('Ex',数字等)。我没有看到这个问题以我喜欢的方式解决。
同样,您必须对应用程序和插件之间传递的结构采取预防措施。一种常见的方法是使所有结构的第一个成员具有结构的大小。这可以作为一种版本控制机制,以便应用程序可以根据其大小确定结构的外观。
以下是一些可能感兴趣的链接:
有很多用脚本语言编写的应用程序支持插件(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创作者的书,但我既不记得作者也不记得这本书的名字。