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()
?似乎没有得到支持