我想编写一个可以通过插件扩展的本地应用程序,最好以动态库的形式。我对应该做什么有一个想法,但是我想一些想法,特别是关于做什么和不做什么的最佳实践提示。我在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”,数字等)。我还没有看到以我喜欢的方式解决此问题。
同样,您必须对在应用程序和插件之间传递的结构采取预防措施。一种通用的方法是使所有结构的第一个成员具有该结构的大小。这就像一种版本控制机制,因此应用程序可以根据其大小确定结构的外观。
以下是一些您可能会感兴趣的链接:
有许多使用脚本语言编写的应用程序,它们支持插件(Wordpress,Drupal,Django等)。您可以查看那些与您为想法编写的应用程序更接近的应用程序。
关于c++ - 编写可插入应用程序的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8276775/