YOU0324 2025-06-26 15:30 采纳率: 60%
浏览 15
已结题

QT项目里怎么调用vs项目

我在研究一个windows应用程序,上面那边要求我在qt上面调用这个程序 而且只能有一个exe 类似于点击按钮然后弹出这个windows应用程序
各位有没有做过这一块的 麻烦给点建议呗
我现在研究往dll这块去封装 但是调用的时候资源文件rc那一块有点问题 有知道的能给个方向和建议不

  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-06-26 15:31
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在Qt项目中调用一个Windows应用程序(如另一个.exe文件),可以通过启动外部进程的方式来实现。你提到“只能有一个exe”,也就是说希望点击按钮后弹出那个独立的Windows应用程序,而不是将其作为DLL嵌入或直接集成到Qt程序中。


    ✅ 一、核心思路

    你可以通过Qt的QProcess类来启动外部可执行文件,这非常适合你的需求:点击按钮 → 弹出另一个Windows应用程序

    重点:使用 QProcess 启动外部 exe 程序是最简单且有效的方式。


    ✅ 二、解决方案步骤

    1. 在Qt界面中添加按钮

    在Qt Designer中拖入一个QPushButton,并为其设置点击事件。

    2. 编写槽函数,调用外部程序

    在对应的.cpp文件中编写如下代码:

    #include <QProcess>
    #include <QMessageBox>
    
    void MainWindow::on_pushButton_clicked()
    {
        QString executablePath = "C:/path/to/your/app.exe"; // 替换为你的exe路径
    
        if (QFile::exists(executablePath)) {
            QProcess::startDetached(executablePath);
        } else {
            QMessageBox::critical(this, "错误", "找不到指定的可执行文件!");
        }
    }
    

    重点:使用 QProcess::startDetached() 可以让新进程独立运行,不会被Qt主程序影响。


    ✅ 三、关于你提到的 DLL 封装问题

    如果你坚持要将该Windows程序封装成DLL,那么需要考虑以下几点:

    1. DLL 的结构要求

    • DLL 必须有导出函数(__declspec(dllexport)
    • 不能包含GUI组件(如窗口、对话框等)——除非你明确知道如何在DLL中创建GUI
    • 如果你要在DLL中启动外部程序,可以使用ShellExecuteCreateProcess API

    2. 示例代码(DLL 中启动exe)

    // dllmain.cpp
    #include <windows.h>
    #include <shellapi.h>
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
        return TRUE;
    }
    
    extern "C" __declspec(dllexport) void RunExternalApp()
    {
        ShellExecute(NULL, "open", "C:/path/to/your/app.exe", NULL, NULL, SW_SHOWNORMAL);
    }
    

    3. Qt 调用 DLL 函数

    在Qt项目中加载DLL并调用函数:

    #include <QLibrary>
    #include <QDebug>
    
    void MainWindow::on_pushButton_clicked()
    {
        QLibrary myLib("mydll.dll");
    
        if (myLib.load()) {
            typedef void (*RunAppFunc)();
            RunAppFunc runApp = (RunAppFunc) myLib.resolve("RunExternalApp");
            if (runApp) {
                runApp();
            } else {
                qDebug() << "无法解析函数 RunExternalApp";
            }
        } else {
            qDebug() << "无法加载 DLL:" << myLib.errorString();
        }
    }
    

    重点:DLL方式复杂度高,容易出现资源冲突、依赖问题、兼容性问题,不推荐用于简单的启动任务。建议优先使用QProcess方式。


    ✅ 四、关于资源文件 .rc 的问题

    你提到“资源文件rc那一块有点问题”,可能是你在打包DLL时遇到了资源编译的问题。

    解决方法:

    • 确保 .rc 文件正确编译为 .res 文件
    • 使用 windres 工具将 .rc 编译为 .res
    • 在项目中链接 .res 文件(例如在Visual Studio中右键项目 → 属性 → 链接器 → 输入 → 添加 .res 文件)

    示例:使用 windres 编译 rc 文件

    windres -i your_resource.rc -o your_resource.res
    

    然后在你的DLL项目中将 your_resource.res 添加到链接器输入中。


    ✅ 五、总结与建议

    | 方案 | 优点 | 缺点 | |------|------|------| | QProcess 启动 EXE | 简单、可靠、无依赖 | 无法控制子程序的UI或交互 | | DLL 封装 + 调用 | 可复用、可扩展 | 复杂、易出错、需处理资源问题 | | 直接调用 EXE(无需封装) | 最快、最直接 | 不适合需要深度集成的场景 |

    推荐方案:使用 QProcess 启动外部EXE,这是最简单、最稳定的方式。


    ✅ 六、补充说明

    如果你真的需要将 Windows 应用程序嵌入到 Qt 中,并且需要与之交互(比如传递参数、获取返回值、控制其生命周期),那么可以考虑以下进阶方案:

    • 使用 QProcess 并监听其输出
    • 使用 COM 或 IPC(如套接字、共享内存)进行进程间通信
    • 使用 Windows API 实现更高级的进程控制(如注入、钩子等)

    如有更多具体需求(如需要与外部程序通信、传递参数等),欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月28日
  • 创建了问题 6月26日