C++ 中的插件系统很困难,因为 ABI 没有正确定义,并且每个编译器(或其版本)都遵循自己的规则。然而,Windows 上的 COM 表明创建最小的插件系统是可能的,该系统允许具有不同编译器的程序员使用简单的接口为主机应用程序创建插件。

让我们实际一点,先把 C++ 标准放在一边,它在这方面没有多大帮助。如果我想为 Windows 和 Mac(以及可选的 Linux)编写一个支持 C++ 插件的应用程序,并且如果我想为插件作者提供相当大的编译器选择(例如不到 2 年的 Visual C++ 版本) 、GCC 或英特尔的 C++ 编译器),我可以依赖 C++ 的哪些功能?

当然,我假设插件是针对特定平台编写的。

在我的脑海中,以下是我能想到的一些 C++ 功能,以及我认为的答案:

  • vtable布局,通过抽象类使用对象?(是的)
  • 内置类型、指针?(是的)
  • 结构体、联合体?(是的)
  • 例外情况?(不)
  • 外部“C”函数?(是的)
  • 具有内置参数类型的 stdcall 非外部“C”函数?(是的)
  • 具有用户定义参数类型的非 stdcall 非外部“C”函数?(不)

如果您能分享该领域的任何经验,我将不胜感激。如果您知道任何具有 C++ 插件系统的相当成功的应用程序,那也很酷。

卡尔

有帮助吗?

解决方案

多布博士的日记有一篇文章 构建您自己的插件框架:第1部分 这是关于这个主题的很好的读物。这是一系列文章的开始,该系列文章涵盖了 C/C++ 跨平台插件框架的体系结构、开发和部署。

其他提示

您可能还想考虑用脚本接口替换传统的插件接口。C/C++ 中的几种脚本语言有一些非常好的绑定,已经解决了您的问题。在它们之上进行构建可能不是一个坏主意。例如,看看 Boost.Python.

Qt 有一个非常好的插件系统,我过去使用过。它使用 Qt 的元对象系统来克服在尝试开发 C++ 插件时通常会遇到的许多问题。

一个例子是如何 Q_DECLARE_INTERFACE 有效,以防止您使用不兼容的插件。另一个是 构建密钥, ,以确保为您的架构、操作系统、编译器加载正确的插件。如果您不使用 Qt 的插件系统,那么您将不得不担心这些事情并自己发明解决方案。这不一定是火箭科学,我并不是说你会失败,但 Trolltech 的人非常聪明,并且花了一段时间思考它,我宁愿使用他们创造的东西,也不愿自己重新发明轮子。

另一个例子是 实时时间间隔 通常不能跨 DLL 边界工作,但是当使用 Qt 时,诸如 qobject_cast 它依赖于元对象系统,可以跨 DLL 边界工作。

我认为您可以安全地基于以下内容创建插件系统:

  • 将插件功能打包到库中(.dll、.so 等)
  • 要求插件公开关键的 C 语言导出。
  • 要求插件实现(并返回指针/引用)抽象 C++ 接口。

可能是最成功的 C++ 插件系统:老好 Adobe Photoshop. 。如果不是这样,可以使用其中一种虚拟合成器格式,例如 VSTi 等。

这本书 不完美的 C++ 作者:Matthew Wilson 有关于这方面的很好的信息。

中的建议似乎是:只要您使用相同(或等效)的编译器,您就可以使用 C++,否则您最好使用 C 作为 C++ 代码之上的接口。

高手 具有跨平台插件架构。

查看:

  1. ACE动态链接库
  2. ACE DLL 管理器

我建议看看这本书
ACE 程序员指南

Firefox 在 XPCOM 上运行(http://www.mozilla.org/projects/xpcom/)。它受到 Microsoft COM 的启发,但它是多平台的。

我有自己的游戏引擎,带有 C++ 插件系统。

我在头文件中有一些代码,因此它被放入插件的编译单元中。

主引擎中的较大函数通过导出的 C 函数进行调用(插件调用 MyObject_somefunction(MyObject *obj),在引擎中仅调用 obj->somefunction())。如果调用 C 函数对您来说很难看,那么可以使用一些标头技巧,当标头包含在插件中时,让成员函数 #define 来调用 C 函数:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

虚函数要么必须是纯函数,要么代码位于头文件中。如果我不是从类继承而只是实例化一个类,则虚拟函数代码可以存在于引擎中,但该类必须导出一些 C 函数来创建和销毁从插件调用的对象。

基本上,我使用的技巧(目标是保持完全的平台独立性)仅相当于 C 导出和头文件技巧。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top