Мое приложение 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
сохраняется для дальнейшего использования.Идея состояла в том, чтобы использовать этот дескриптор процесса для выключения дочернего процесса (script + exe).
Но когда я пытаюсь закрыть его, кажется, ничего не происходит.Окно консоли и долго работающее приложение .NET успешно продолжают работать.Это вызов TerminateProcess()
:
TerminateProcess(child_process_handle, 1);
CloseHandle(child_process_handle);
Должен ли TerminateProcess()
работать в этом случае?Возможно, потому что это консольное окно, которое не работает?