C++中的插件系统很难,因为ABI没有正确定义,每个编译器(或其版本)都遵循自己的规则.但是,Windows上的COM表明,可以创建一个最小的插件系统,允许具有不同编译器的程序员使用简单的界面为主机应用程序创建插件.
让我们变得实用,并且在这方面保留C++标准,除了一分钟之外.如果我想为支持C++插件的Windows和Mac(以及可选的Linux)编写应用程序,并且我想为插件作者提供相当多的编译器选择(比如说不到2年的Visual C++版本) ,GCC或英特尔的C++编译器),我可以依靠C++的哪些特性?
当然,我认为插件是针对特定平台编写的.
在我的脑海中,这里有一些我能想到的C++特性,我认为答案是:
vtable布局,通过抽象类使用对象?(是)
内置类型,指针?(是)
结构,工会?(是)
异常?(没有)
外部"C"功能?(是)
带有内置参数类型的stdcall非外部"C"函数?(是)
非stdcall非外部"C"函数与用户定义的参数类型?(没有)
我很感激您在该领域的任何经验,您可以分享.如果您知道任何具有C++插件系统的中等成功应用程序,那也很酷.
卡尔
Dobb博士的期刊有一篇文章构建自己的插件框架:第1部分,这是一个非常好的阅读主题.它是一系列文章的开始,这些文章涵盖了C/C++跨平台插件框架的体系结构,开发和部署.
您可能还想考虑用脚本接口替换传统的插件接口.对于已经解决了您的问题的C/C++中的几种脚本语言,有一些非常好的绑定.在它们之上构建可能不是一个坏主意.例如,看看Boost.Python.
Qt有一个非常好的插件系统,我过去曾经使用过.它使用Qt的元对象系统来克服在尝试开发C++插件时通常会遇到的许多问题.
一个例子是如何Q_DECLARE_INTERFACE
工作,以防止您使用不兼容的插件.另一个是构建密钥,以确保为您的体系结构,操作系统,编译器加载正确的插件.如果您不使用Qt的插件系统,那么您需要担心这些并自行创建解决方案.这不一定是火箭科学,我并不是说你失败了,但奇趣科技的人非常聪明并且花了一段时间思考它,我宁愿使用他们创造的东西而不是自己重新发明轮子.
另一个例子是RTTI通常不能跨DLL边界工作,但是当使用Qt时,依赖于元对象系统的qobject_cast之类的东西在DLL边界上工作.