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