Qt 非常适合构建应用程序,但有一两次我想展示一个来自现有应用程序的漂亮的 Qt 对话框,该应用程序是用纯 C 编写的。
我想描述如何创建一个基于 Qt 的共享或静态库,该库可由不支持 Qt 的程序使用。为了缩小问题的范围,假设我们调用了一个显示一些对话框或小部件的函数,并且在所有对话框关闭之前不会返回。否则,如果没有来自托管进程的一些“合作”,它就无法完成——它至少必须为 Qt 运行消息泵。
在这个例子中,我将使用 Windows 程序 rundll32.exe
加载并执行显示 Qt 关于对话框的函数。
最佳答案
假设我们的 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 or Project->Libraries->C++ Library,项目名称应该是MyQtBasedDll
.
MyEntryPoint()
函数的代码非常简单:
extern "C"
{
__declspec(dllexport) void MyEntryPoint()
{
if (!QApplication::instance()) {
QApplication a(__argc, __argv);
QMessageBox::aboutQt(0);
} else {
QMessageBox::aboutQt(0);
}
}
}
这个函数可以被同一个exe调用多次,每次构造一个新的QApplication
对象,只在函数运行期间调用。请注意,我们检查现有实例,因此我们的 DLL 即使在被 Qt 应用程序调用时也能正常工作。
现在您需要做的就是将 QMessageBox::aboutQt(0);
替换为您的函数以执行有用的操作!
关于c++ - 从 C 程序使用 Qt 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267066/