Я работаю над проектом, который включает потоки и процессы. Я открываю многопоточность и для каждого потока открываю процесс, запускающий exe-файл. В случае, если программа завершается с возвращенным значением, отличным от 0, происходит сбой, и возвращаемое значение должно быть напечатано. чтобы получить возвращаемое значение, я использую функцию WIN API GetExitCodeProcess () моя проблема в том, что эта функция всегда возвращает значение 1, даже если программа должна была вылететь из строя, но почему? вот мой соответствующий код:
static DWORD WINAPI RunningTests(test_s *test)
{
PROCESS_INFORMATION procinfo;
DWORD waitcode;
DWORD exitcode;
int status = 0, crashed = 0;
char cmdLineString[MAX_NUMBER_OF_CHARS_IN_CMD_LINE] = "";
char *cmdLineStringPtr = cmdLineString;
(test)->isCrashed = 0;
CreateCmdLine((*test).testExePath, &cmdLineStringPtr);
status = CreateProcessSimple(_T(cmdLineString), &procinfo);
if (status == -1)
{
return 1;
}
waitcode = WaitForSingleObject(procinfo.hProcess,
TIME_UNTIL_TIMED_OUT_IN_MILLISEC);
if (waitcode == WAIT_TIMEOUT) /* Process is still alive */
{
strcpy((*test).status, "Timed Out");
CloseHandle(procinfo.hProcess);
CloseHandle(procinfo.hThread);
return 0;
}
crashed = GetExitCodeProcess(procinfo.hProcess, &exitcode);
if (crashed == 0) /* Process is crashed */
{
strcpy((*test).status, "Crashed");
(*test).isCrashed = 1;
(*test).returnedCrashedValue = exitcode;
CloseHandle(procinfo.hProcess);
CloseHandle(procinfo.hThread);
return 0;
}
CloseHandle(procinfo.hProcess);
CloseHandle(procinfo.hThread);
return CompareFiles(&test);
}
как успех или неудача GetExitCodeProcess связаны с падением процесса ?! если вы передали в api действительный дескриптор процесса с доступом PROCESS_QUERY_INFORMATION или PROCESS_QUERY_LIMITED_INFORMATION - GetExitCodeProcess вернет истину. потому что procinfo.hProcess всегда действителен и имеет требуемый доступ - GetExitCodeProcess и всегда должен возвращать истину
и ищите смысл выхода exitcode, только если GetExitCodeProcess возвращает истину. а вы делаете наоборот - смотрите на провал, что не так. а ручки закрываешь с 3-х мест, а не одиночных





Вы должны смотреть на код выхода, а не на сбой;
Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Из MSDN: Если функция завершается успешно, возвращаемое значение отличное от нуля. Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.