插件API设计

2024-03-10

所以我有一个很大程度上基于使用 QPlugin 系统的 QT API 的应用程序。使用起来相当简单,您定义一个从接口继承的类,加载插件时您将获得该类的实例。最终它会归结为dlopen/dlsym or LoadLibrary/GetProcAddress,任何适合操作系统的内容。我在这里没有任何问题,一切都按预期进行。

那么,进入正题吧。有一个lot涉及需要引用主应用程序提供的数据/功能的插件的功能。例如,我的应用程序有一个 GUI,所以我的应用程序中有一个“plugin::v1::gui“函数返回一个QWidget *。如果我希望插件能够向我的 UI 添加内容,或者甚至使其对话框成为我的 UI 的子项,那么它需要一个指向它的指针。

我开始在 Linux 上进行开发,很快就遇到了这样一个事实:默认情况下,加载程序不会使用加载它的应用程序中的符号来填充共享对象中未解析的符号。没问题,轻松修复。添加 ”-rdynamic“到我的旗帜上并继续前进。事情进展顺利。

现在我发现 Windows 上似乎没有等效的解决方案:(。那么什么是好的解决方案呢?

到目前为止,我想出的最好的办法是在主应用程序中填充一个结构,该结构具有指向插件可能关心的每个对象/函数的指针。然后将其传递给插件的“init()“函数,现在它有了指向所有内容的正确指针,但这是一个烦人的解决方案,因为现在每当我添加某些内容时我都必须在多个地方进行更改。

有更好的解决方案吗? SO 社区是如何处理这个问题的?


为应用程序将公开的主要交互对象创建一组接口,并将它们构建在它们自己的 lib/dll 中,并根据需要在应用程序中的类上实现这些接口。该库还应该包括一个插件接口,其中可能只有一个插件对象将实现的“初始化”方法。

应用程序和插件显然将链接到该 DLL,一旦应用程序加载插件,应用程序就应该调用插件的初始化方法,该方法将具有接受控制应用程序所需的任何对象的参数。

简化此操作的一种流行方法是在应用程序中实现类似于 DOM 的层次结构,以便插件可以从一个根对象获取应用程序中的所有相关对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

插件API设计 的相关文章

随机推荐