c++ - 从 C 程序使用 Qt 库

标签 c++ c qt dll

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/

相关文章:

c++ - 尽管有 if 语句,Visual Studio 仍尝试包含 linux header

c - 将 Cucumber 与 C 结合使用

c++ - 无法将参数 4 从 'void' 转换为 'const char *'

qt - 处理 QQuickItem 上的鼠标事件

c++ - 这个析构函数声明是 C++ Primer (Stanley Lippman) 中的拼写错误吗?

c++ - 简单的 constexpr - C26498 警告和 C2131 错误

c++ - 分辨率有区别吗?

c++ - 限制用户可以在 QFileDialog 中选择的文件数量

c++ - 尝试运行 "Hello, world!"桌面应用程序 QT 时出现多个错误

c - 为什么这种计算整数符号的方法可以避免在带有标志寄存器 (IA32) 的 CPU 上发生分支?