Eva*_*ran 12 c++ api dll plugins qt
所以我的应用程序主要基于使用QPlugin系统的QT API.它使用起来相当简单,你定义了一个从接口继承的类,当加载插件时,你得到一个该类的实例.最后,它将归结为dlopen/ dlsym或LoadLibrary/ GetProcAddress,适用于操作系统的任何内容.我没有问题,一切都按预期工作.
所以,关于这个问题.有许多功能涉及插件需要引用主应用程序提供的数据/功能.例如,我的应用程序有一个GUI,所以我在我的应用程序中有一个" plugin::v1::gui"函数返回一个QWidget *.如果我想要一个插件能够将内容添加到我的UI中,或者甚至让它的对话框成为我的UI的子对象,它将需要一个指向它的指针.
我在Linux上开始开发并很快遇到这样一个事实:默认情况下,加载器不会在加载它的应用程序中填充共享对象中未解析的符号.没问题,容易解决.-rdynamic在我的旗帜上添加" "并继续前进.工作得很好.
现在我发现在Windows上似乎没有相应的东西:(.那么什么是一个好的解决方案?
到目前为止,我提出的最好的方法是在我的主应用程序中填充一个结构,该结构包含指向插件可能关心的每个对象/函数的指针.然后将它传递给插件的" init()"函数,现在它有适当的指针指向所有内容,但这是一个烦人的解决方案,因为现在我必须在多个地方进行更改,每当我添加一些东西.
有更好的解决方案吗?SO社区如何处理这个问题?
为应用程序将公开的主要交互对象创建一组接口,并将它们构建在它们自己的 lib/dll 中,并根据需要在应用程序中的类上实现这些接口。该库还应该包括一个插件接口,其中可能只有一个插件对象将实现的“初始化”方法。
应用程序和插件显然将链接到该 DLL,一旦应用程序加载插件,应用程序就应该调用插件的初始化方法,该方法将具有接受控制应用程序所需的任何对象的参数。
简化此操作的一种流行方法是在应用程序中实现类似于 DOM 的层次结构,以便插件可以从一个根对象获取应用程序中的所有相关对象。