我的 C++ 应用程序将 .cmd 文件作为子进程启动,如下所示:
SHELLEXECUTEINFOA execInfo = {0};
execInfo.cbSize = sizeof(execInfo);
execInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NOASYNC;
execInfo.lpVerb = "open";
execInfo.lpFile = "test.cmd";
execInfo.lpDirectory = "C:\\some\\directory";
execInfo.nShow = SW_SHOWNORMAL;
BOOL result = ShellExecuteExA(&execInfo);
该脚本test.cmd
运行一个运行很长时间的控制台模式 .NET 应用程序,它看起来类似于:
@echo off
echo Starting a long task...
dotnet.exe runforhours.dll
在ShellExecuteExA()
我的 C++ 应用程序中返回时,execInfo.hProcess
会保存其中的进程句柄以供以后使用。这个想法是使用该进程句柄来关闭子进程(脚本+ exe)。
但是当我试图关闭它时,似乎什么也没有发生。控制台窗口和长时间运行的 .NET 应用程序都愉快地继续运行。这是调用TerminateProcess()
:
TerminateProcess(child_process_handle, 1);
CloseHandle(child_process_handle);
应该TerminateProcess()
期望在这种情况下工作吗?可能是因为这是一个无法正常工作的控制台窗口吗?