在C或C+中实现插件系统+; 在C中实现插件风格系统的技巧是什么? C(我也认为C++也一样,虽然我自己没有做过),但这通常是使用动态加载的模块完成的。此类应用程序的API:s依赖于平台

在C或C+中实现插件系统+; 在C中实现插件风格系统的技巧是什么? C(我也认为C++也一样,虽然我自己没有做过),但这通常是使用动态加载的模块完成的。此类应用程序的API:s依赖于平台,c++,c,plugins,C++,C,Plugins,在POSIX(Linux)上,可以使用函数系列。基本上,您单独构建插件,然后在运行时加载它,按名称查找其符号,然后可以调用它们 对于Win32,有一个,它的作用非常类似,您可以将代码构建到DLL中 要获得一个方便的包装器,使所有这些都变得简单和透明,请查看GLib的API。我已经成功地使用了一个相当简单的系统: 为插件创建API规范 使用单例插件管理器 使用基于LoadLibrary/GetProcAddress的运行时动态链接 实现基于控件的事件处理反转以通知插件 在92/93的时间框架中

在POSIX(Linux)上,可以使用
函数系列。基本上,您单独构建插件,然后在运行时加载它,按名称查找其符号,然后可以调用它们

对于Win32,有一个
,它的作用非常类似,您可以将代码构建到DLL中


要获得一个方便的包装器,使所有这些都变得简单和透明,请查看GLib的API。

我已经成功地使用了一个相当简单的系统:

  • 为插件创建API规范
  • 使用单例插件管理器
  • 使用基于LoadLibrary/GetProcAddress的运行时动态链接
  • 实现基于控件的事件处理反转以通知插件

在92/93的时间框架中,我研究了一个插件结构,它是用C++编写的。PigMeMek是在一个称为VAMP的C++ OOP框架上构建的,它帮助了Mac OS和Windows之间的可移植性。 <>我们尝试使用C++的特性来构建插件体系结构。这被证明是非常棘手的C++类由于所谓的脆性基类问题。我接着写了一篇论文,发表在期刊上,并在OOPSLA'93的反思研讨会上发表。在波特兰举行的Usenix会议上,我还与比亚恩·斯特劳斯图普取得了联系,并与他进行了几个月的对话,他代表我支持处理脆弱的基层问题。(唉,当时其他问题被认为更重要。)

微软推出了COM/DCOM系统,该平台被视为解决该问题的可行方案。C++可以作为COM接口的抽象语言,用于定义COM接口。 然而,现在开发人员避开COM/DCOM

相比之下,NeXT在90年代初的下一步框架中使用Objective C设计了一个插件架构。如今,苹果电脑和重要平台(如iPhone)上的MacOSX充满活力

我提交的目标C能够以更好的方式解决插件问题

我个人认为C++的脆性基类问题是它最致命的缺陷。
如果我们使用基于C的语言家族构建插件体系结构,我们将使用Objective C来实现这一点。

最好使用像ACE()这样的框架,以保护您(尽可能好地)不受平台特定编码的影响

ACE包含一个基于共享库的插件框架,可用于创建动态组装的应用程序


一个更高级别的抽象检查CiAO()CORBA组件模型的开源C++实现。

这可能不是你要找的,但是你可以在你的应用程序中嵌入一个脚本语言,比如Lua。Lua被设计为嵌入到其他程序中,并用作编写插件的脚本语言。我相信将Lua解释器添加到您的程序中是相当容易的,尽管我不了解Lua,所以我无法保证这一解决方案的有效性。其他有更多Lua经验的人,请添加关于您在其他应用程序中嵌入Lua的经验的评论

当然,这意味着您的插件需要用Lua编写。如果您不喜欢Lua,那么事实上的标准Perl、Python和Ruby解释器都是用C编写的,可以嵌入C程序中。我知道有很多程序使用这些语言作为脚本语言扩展

然而,我不知道你在找什么,因为你的问题有点模糊。也许更多关于你希望人们能够用这些插件做什么的信息是合适的。对于某些任务,一种成熟的脚本语言可能有点过火。

可能也很有趣。

Qt提供了QPluginLoader:

如果您需要/想要更细粒度的控制,Qt还提供了使用QLibrary动态加载库的方法:


更好的是,它们可以跨平台移植。

看,这对你来说可能很有趣

> P>我编写了一个插件库,它从DLL文件中加载C++类,这里是我使用的逻辑:

用户从具有唯一名称的dll导出c函数。此名称必须足够唯一,因为从DLL加载时无法使用其参数区分函数

C函数注册一个或多个称为“驱动程序”的工厂类。每个驱动程序类都与一个字符串相关联。当主应用程序想要创建一个类时,它使用关联的字符串收集相关的工厂类。我还实现了一个版本检查系统,不加载旧插件

Dll加载是使用LoadLibraryA和GetProcAddress函数完成的(Pugg目前在windows上工作)


值得一提的是,主应用程序和DLL应使用相同的编译器和相同的编译选项(发布/调试模式、优化设置、stl版本等)进行编译。否则,类的映射可能会出现问题。

我能给出的最好的平台和语言中立的建议是:

围绕插件SDK设计整个应用程序。

在我看来,插件SDK不应该是事后诸葛亮。如果您将应用程序设计为基本上是一个加载插件的空壳,那么核心功能将在您自己的SDK中实现,您将获得以下好处:

  • 组件的高度模块化和目的的明确分离(这迫使您的体系结构变得良好)
  • 它迫使你的SDK变得非常好
  • 它允许其他第三方开发人员制作非常强大的核心组件