通过 C API 提供 QWidget 的 DLL

Posted

技术标签:

【中文标题】通过 C API 提供 QWidget 的 DLL【英文标题】:DLL providing QWidget over C API 【发布时间】:2013-04-17 12:43:22 【问题描述】:

我有一个使用 C API 动态加载 DLL 的 Qt 主应用程序。我不能使用 Qt 插件,因为一些 DLL 是纯 C 的。

现在我希望 DLL 能够使主 Qt 应用程序打开一个窗口,装饰它并添加 DLL 提供的 QWidget。

我担心如果我只是将它作为 void* 推送并将其添加为 QWidget,主应用程序将在窗口关闭时尝试释放它,这可能会导致未定义的行为。

【问题讨论】:

为什么不直接将创建 QWidget 的回调函数传递给 DLL? 那么几个DLL是纯C的,不能在Qt插件系统之外加载吗? @user1095108 他们都应该使用相同的API,我不想写两次。他们大多只实现 API 的一部分,例如C DLL 不会实现 Qt 钩子。 【参考方案1】:

主要问题是主应用程序是动态还是静态链接到 Qt。如果是动态的,则解决了静态数据共享的问题(因为它主要驻留在 DLL 中)。

没有更多细节,我只会说“试试看”,看看有什么问题。

【讨论】:

动态链接。实际上,试一试也不错,尤其是因为我没有任何其他想法。 它实际上似乎工作。我不知道如何或为什么,但确实如此。我在 DLL 中创建 QWidget 并将其传递给主应用程序,主应用程序将其放在窗口中。我什至可以调用 reinterpret_cast(widget->parent())->close();从 DLL 内部(对按钮按下作出反应)。我不认为有内存泄漏,它不会死,它似乎只是出于某种原因工作。谢谢:)

以上是关于通过 C API 提供 QWidget 的 DLL的主要内容,如果未能解决你的问题,请参考以下文章

c语言怎么调用dll文件

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)

在通过 API Endpoint 或通过 Dll 引用访问 WCF 之间进行选择

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)

api在windows系统下哪个文件夹里?

使用C ++ API注册COM DLL的所有接口