问题背景:在程序A中启动程序B,程序A需要知道程序B是否已经退出,再来决定下一步的操作逻辑。
无论程序A是通过何种方式(CreateProcess 或者 ShellExecuteEx)来启动程序B的,一般的做法就是拿到程序B的进程句柄,再使用 WaitForSingleObject 来判断程序B是否已经结束。示例代码如下:
#include <Windows.h>
#include <stdio.h>
int main()
{
char szCommandLine[256] = "D:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe";//执行文件路径
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
BOOL success = ::CreateProcessA(
NULL,
szCommandLine,
NULL,
NULL,
FALSE,
0,
NULL,
"D:\\Program Files (x86)\\Tencent\\QQ\\Bin\\",
(LPSTARTUPINFOA)(&si),&pi);
if(!success)
{
printf("create process failed!\n");
}
else
{
printf("create process success!\n");
HANDLE hProcess = pi.hProcess;//获得进程对应的HANDLE
DWORD dw = ::WaitForSingleObject(hProcess, INFINITE);//调用WaitForSingleObject等待事件
//如果结束,将发出信号
switch(dw)
{
case WAIT_OBJECT_0:
printf("process exit!\n");
break;
case WAIT_TIMEOUT:
printf("process timeout!\n");
break;
case WAIT_FAILED:
printf("process failed!\n");
break;
}
}
return 0;
}
HANDLE RunExe(std::wstring szFilePath, std::wstring szParam)
{
std::wstring param;
param.append(L" ");
param.append(szParam);
SHELLEXECUTEINFOW sei = { sizeof(SHELLEXECUTEINFOW) };
sei.fMask = SEE_MASK_FLAG_NO_UI/* 打开失败时不弹出错误框 */
| SEE_MASK_NOCLOSEPROCESS/* 设置SEE_MASK_NOCLOSEPROCESS, sei.hProcess才有值 */
| SEE_MASK_NOZONECHECKS;/* 不会弹出是否运行的提醒 */
sei.lpFile = szFilePath.c_str();
sei.lpParameters = szParam.c_str();
if (!ShellExecuteEx(&sei))
{
return NULL;
}
return sei.hProcess;
}