ShellExecute 如何知道脚本运行完成
时间: 2024-01-01 09:04:35 浏览: 68
ShellExecute 函数本身并不会等待脚本执行完成,它只是启动一个进程并立即返回。如果你需要等待脚本执行完成,可以使用 CreateProcess 函数启动进程,然后使用 WaitForSingleObject 等待进程结束。具体步骤如下:
1. 使用 CreateProcess 函数创建进程,设置 bInheritHandles 参数为 TRUE,以便可以继承父进程的标准输出和错误输出句柄。
2. 使用 GetExitCodeProcess 函数获取进程的退出代码。如果进程还在运行,GetExitCodeProcess 函数将返回 STILL_ACTIVE。
3. 如果进程已经退出,使用 CloseHandle 函数关闭进程句柄。
4. 如果进程还在运行,使用 WaitForSingleObject 函数等待进程结束。等待结束后,使用 GetExitCodeProcess 函数获取进程的退出代码,并使用 CloseHandle 函数关闭进程句柄。
以下是示例代码:
```
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
if (CreateProcess(NULL, "script.bat", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD exitCode;
if (GetExitCodeProcess(pi.hProcess, &exitCode))
{
if (exitCode == STILL_ACTIVE)
{
// 进程还在运行
}
else
{
// 进程已经退出,可以关闭进程句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
}
```
注意,在等待进程结束时,可以使用 INFINITE 参数表示等待无限长的时间,也可以使用一个超时时间,以便在一定时间内检查进程是否已经结束。
阅读全文