我想编写一个可以通过插件扩展的本地应用程序,最好以动态库的形式。我对应该做什么有一个想法,但是我想一些想法,特别是关于做什么和不做什么的最佳实践提示。我在Java和php上使用过类似的工具,所以希望我不要在C++中引入任何不良习惯。

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

最佳答案

对于插件,我认为有些重要的事情:

  • 语言支持

  • 如果要使用最多的平台/语言/编译器,则应使用C而不是C++编写插件接口(interface)。插件开发人员仍然可以用C++编写其函数,当然,只是C接口(interface)。问题是每个C++编译器都会以自己的方式处理符号名称,因此,如果您使用C++,则将迫使插件开发人员执行以下操作:使用与您使用的相同的编译器和工具。另一方面,只有一种导出C符号的方法,因此为插件使用C接口(interface)将允许开发人员选择他们喜欢的任何工具,并且只要他们可以生成标准的.so/.dll库,他们就可以没事的。
  • 内存分配

  • 在某些平台上,由DLL释放应用程序分配的内存时会出现问题,反之亦然。如果插件具有应该分配内存的功能,请确保您还要求插件提供相应的功能以释放该内存。同样,如果插件可以在应用程序中调用函数来分配内存,则还应该公开该内存的发布函数。
  • 版本控制

  • 编写插件后,您可能必须修改插件API。因此,您的应用程序需要准备好加载为旧版本开发的插件。您应该在插件中需要一个“init”函数,应用程序会调用该函数来确定该插件实现的API版本以及该应用可能需要知道的其他信息,例如插件类型(如果有不同类型),已实现,未实现,等等。

    另外,在修改插件API时必须非常小心。您无法更改现有功能,因为那样会破坏较旧的插件。相反,您将需要添加那些具有改进功能的替代版本。接下来的问题是如何命名现有功能的新版本。通常,他们会获得相同的名称以及一些后缀(“Ex”,数字等)。我还没有看到以我喜欢的方式解决此问题。

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

    以下是一些您可能会感兴趣的链接:
  • C-Pluff,C中的通用插件框架(MIT许可)
  • lighttpd的plugin.h头文件
  • This page讨论了如何在Mac OS X下实现插件体系结构,包括有关如何为插件创建C接口(interface)的简短概述。
  • Blender很有趣。该应用程序是用C++编写的,而插件是用Python编写的。确实不是一个坏主意,它使开发人员更容易编写插件。

  • 有许多使用脚本语言编写的应用程序,它们支持插件(Wordpress,Drupal,Django等)。您可以查看那些与您为想法编写的应用程序更接近的应用程序。

    关于c++ - 编写可插入应用程序的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8276775/

    10-11 01:28
    查看更多