Как использовать TerminateProcess (), чтобы закрыть окно консоли - PullRequest
0 голосов
/ 24 ноября 2018

Мое приложение 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() работать в этом случае?Возможно, потому что это консольное окно, которое не работает?

...