我有三个申请:
- 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
何时完成的方法。
任何想法如何实现这一目标?
答案 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))