Qt非常适合构建应用程序,但有一两次我想从用纯C编写的现有应用程序中显示一个不错的Qt对话框。
我想描述如何创建一个可以由Qt-unaware程序使用的基于Qt的共享或静态库。为了缩小问题范围,让我们假设我们调用一个显示一些对话框或小部件的函数,并且在所有对话框都关闭之前不会返回。否则,如果没有来自托管流程的“合作”,它就无法完成 - 它必须至少为Qt运行消息泵。
在本例中,我将使用Windows程序rundll32.exe
加载并执行一个显示Qt about对话框的函数。
答案 0 :(得分:2)
假设我们的DLL名为MyQtBasedDll.dll
,它有一个导出的函数 - void MyEntryPoint()
。
我们将使用命令行rundll32.exe MyQtBasedDll.dll,MyEntryPoint
运行它。请注意,您需要为exe和dll提供完整路径。
为了rundll32.exe
加载和使用该程序,MyEntryPoint()
应具有C调用约定。此外,我们需要一个QApplication
实例来执行任何GUI操作,rundll32.exe
显然不会为我们创建它。
要使用Qt Creator创建Qt库,我们可以选择 File-> New File或Project-> Libraries-> C ++ Library ,项目名称应为{{1} }。
MyQtBasedDll
函数的代码非常简单:
MyEntryPoint()
此函数可以由同一个exe多次调用,并且每次构造一个新的extern "C"
{
__declspec(dllexport) void MyEntryPoint()
{
if (!QApplication::instance()) {
QApplication a(__argc, __argv);
QMessageBox::aboutQt(0);
} else {
QMessageBox::aboutQt(0);
}
}
}
对象时,仅在函数的持续时间内。请注意,我们检查现有实例,以便即使在Qt应用程序调用时我们的DLL也能正常工作。
现在你需要做的就是用你的函数代替QApplication
!