Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT是否向另一个QT应用程序发送信号?_C++_Windows_Qt - Fatal编程技术网

C++ QT是否向另一个QT应用程序发送信号?

C++ QT是否向另一个QT应用程序发送信号?,c++,windows,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
  • 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
何时完成


有什么办法可以做到这一点吗?

既然您指定在Windows下运行,我认为最简单的方法就是使用Windows消息传递系统。以下各项的说明:

现在,在Qt应用程序中,您需要使用QWidget的winEvent:

该页面提供了一个很好的示例,介绍了如何创建支持Windows的Qt应用程序


但是,如果您真的只想检查应用程序是否已完成,那么只需通过
runas
命令()启动“Updater.exe”以管理员身份运行,然后等待它完成(QProcess::waitForFinished())

,因为您指定在Windows下运行,我认为最简单的方法是使用windows消息传递系统。以下各项的说明:

现在,在Qt应用程序中,您需要使用QWidget的winEvent:

该页面提供了一个很好的示例,介绍了如何创建支持Windows的Qt应用程序


但是,如果您确实只想检查应用程序是否已完成,那么只需通过
runas
命令()启动“Updater.exe”以管理员身份运行,然后等待它完成(QProcess::waitForFinished())

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

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

当它完成时,一个开始和看到的例子看起来如何?不确定我是否完全遵循了Qprocess似乎无法启动Updater.exe,因为它需要管理员权限将其添加到
Updater.exe的.pro中,但仍然没有打开我忘记了。。。在这种情况下不能使用QProcess。是否要使用任何东西来代替
toAscii()
?似乎不被支持一个开始并在完成时看到的示例看起来如何?不确定我是否完全遵循了Qprocess似乎无法启动Updater.exe,因为它需要管理员权限将其添加到
Updater.exe的.pro中,但仍然没有打开我忘记了。。。在这种情况下不能使用QProcess。是否要使用任何东西来代替
toAscii()
?似乎没有得到支持