c++ - QT 向另一个 QT 应用程序发送信号?

标签 c++ windows qt

我有三个应用程序:

  • ApplicationLauncher.exe
  • Updater.exe
  • MyApplication.exe

我想使用 ApplicationLauncher.exe 来启动 Updater.exe 并且当 Updater.exe 完成更新时它应该发送向 ApplicationLauncher.exe 发出信号,然后应启动 MyApplication.exe

这是因为 Updater.exe 需要管理员权限才能更新,所以我想在更新程序工作时保持 ApplicationLauncher.exe 运行,然后使用 ApplicationLauncher.exe 启动 MyApplication.exe

为了让它工作,我需要一种方法让 ApplicationLauncher.exe 知道 Updater.exe 何时完成。

有什么想法可以实现吗?

最佳答案

您只需要生成一个进程,并等待它完成。没有数据通信,所以没有真正的 IPC。

因为更新程序需要提升权限,所以不能使用 QProcess。我们在 Windows 上,您需要回退到 win32 API。

QDir exePath(QCoreApplication::instance()->applicationDirPath());
QString exeFileName = exePath.absoluteFilePath("update.exe");
QByteArray exeFileNameAnsi = exeFileName.toAscii();

    // we must use ShellExecuteEx because we need admin privileges on update
    // the standard QProcess functions do not provide this.
    SHELLEXECUTEINFOA lpExecInfo;
    lpExecInfo.cbSize  = sizeof(SHELLEXECUTEINFO);
    lpExecInfo.lpFile = exeFileNameAnsi.constData();
    lpExecInfo.fMask=SEE_MASK_DOENVSUBST|SEE_MASK_NOCLOSEPROCESS;
    lpExecInfo.hwnd = NULL;
    lpExecInfo.lpVerb = "open";
    lpExecInfo.lpParameters = NULL;
    lpExecInfo.lpDirectory = NULL;
    lpExecInfo.nShow = SW_SHOW ;
    lpExecInfo.hInstApp = (HINSTANCE)SE_ERR_DDEFAIL;
    if( ShellExecuteExA(&lpExecInfo) && lpExecInfo.hProcess != NULL) {
        DWORD retval;
        DWORD waitresult;
        do {

            waitresult = WaitForSingleObject(lpExecInfo.hProcess, 10);
        } while (waitresult == WAIT_TIMEOUT);
        GetExitCodeProcess(lpExecInfo.hProcess, &retval);
        CloseHandle(lpExecInfo.hProcess);

        if(retval == 0) {
            // launched and finished without errors
        }
    } else {
       // failed to launch
    }

我认为您可能还需要链接到 PRO 文件中的 shell32.lib,不确定。

LIBS += -lshell32

关于c++ - QT 向另一个 QT 应用程序发送信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23360292/

相关文章:

c++ - 将 Lambda 存储在类段错误中

C++ cout.endl() 清除缓冲区,cout.flush() 不

windows - 我可以在 Windows 10 上获取(新的)bash 来加载 .profile

c++ - Halcon 9.0 在 Windows 10(但不是 Windows 8.1)下生成错误

c++ - 重写的插槽 shouldInterruptJavaScript() 未被调用

c++ - setChecked() 在类里面不起作用

c++ - 当程序预期根据用户输入再次循环时,它反而会导致段错误 : 11

c++ - 为什么 std::vector 允许对其包含的类型使用可抛出的移动构造函数?

c++ - 使用 OpenCV 进行模板匹配的图像类型问题

python - 在pyqt中模拟鼠标移动