程序A启动了程序B,并判断程序B是否已经退出

问题背景:在程序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;
}


通过 ShellExecuteEx 启动程序的代码如下:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值