QT将信号发送到另一个QT应用程序?

时间:2014-04-29 09:08:50

标签: 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 1}}

要实现这一点,我需要ApplicationLauncher.exe了解Updater.exe何时完成的方法。

任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

您只需要生成一个进程,并等到它完成。没有数据通信,所以没有真正的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

答案 1 :(得分:1)

由于您指定在Windows下运行,我认为最简单的方法是使用Windows消息传递系统。对它们的描述:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632590%28v=vs.85%29.aspx

现在,在Qt应用程序中,您将需要使用QWidget的winEvent:http://qt-project.org/doc/qt-4.8/qwidget.html#winEvent

页面http://doc.qt.digia.com/solutions/4/qtwinmigrate/winmigrate-win32-in-qt-example.html就如何制作支持Windows的Qt应用程序提供了一个很好的例子。

但是,如果您真的只想检查应用程序是否已完成,那么只需通过runas命令(http://qt-project.org/forums/viewthread/19060)启动“Updater.exe”即可以管理员身份运行,然后等待它完成(QProcess :: waitForFinished(http://qt-project.org/doc/qt-4.8/qprocess.html#waitForFinished))