Компактная версия вашего кода делает ошибку очевидной:
if (hProcess != NULL)
{
// Left out for brevity
}
else
{
// Here, hProcess is NULL
CloseHandle(hProcess);
SystemErrorMessage();
}
По сути, это вызов CloseHandle(NULL);
, предположительно устанавливающий код последней ошибки потока в ERROR_INVALID_HANDLE
.SystemErrorMessage()
вероятно, слепо вызывает GetLastError
(без оценки того, должен ли он) и выдает исключение, если возвращаемое значение отличается от ERROR_SUCCESS
.
Чтобы исправить это, вам нужно исправить логическую ошибку(уберите звонок на CloseHandle
в ветке else
, в которой вы знаете, что hProcess
является недействительным).Когда закончите, переделайте всю обработку ошибок.Это не будет работать надежно.Вы не можете слепо вызывать GetLastError , каждый раз, когда вызов API не удался.Закончив с этим, изучите идиому RAII , чтобы вам не приходилось писать код ручной очистки, как вы должны делать с C.