GetExitCodeProcess () создает исключение первого шанса с помощью Application Verifier

Я использую CreateProcess () для запуска исполняемого файла и вызываю GetExitCodeProcess () в конце, чтобы получить код выхода процесса. Когда я запускаю его с помощью верификатора приложения, я получаю исключение первого шанса. Я приложил изображение журнала.введите описание изображения здесь

Номер строки 1348 является строкой сразу после вызова GetExitCodeProcess (). Я не очень знаком с форматом журнала, поэтому я спрашиваю, является ли исключение, генерируемое внутри GetExitCodeProcess (), в этом случае я могу игнорировать его или я делаю что-то не так в своем коде, потому что он указывает на строку после вызова GetExitCodeProcess ()?

Изменить: мой код:

  if (!CreateProcess(
NULL,  // it will get the app name from the next argument
cString, // command line
NULL,
NULL,
TRUE, // don't inherit handles
CREATE_NO_WINDOW,
NULL, // use environment of the calling process
NULL, // use same current drive and directory as the calling process
&siStartupInfo,
&processInfo
))
{
// If process failed return error
...
}

// Close handles the passed to the child process.
CloseHandle(hChildStd_ERR_Wr);
CloseHandle(hChildStd_OUT_Wr);

// Now read the std::out and std::err from child process and store them in strings to return
DWORD dwRead;
CHAR chBuf[4096];
memset(chBuf, 0, 4096);
BOOL bSuccess = FALSE;
UString out = "", err = "";
for (;;) {
bSuccess=ReadFile( hChildStd_OUT_Rd, chBuf, 4096, &dwRead, NULL);
if( ! bSuccess || dwRead == 0 )
break;

UString s(chBuf, dwRead);
out += s;
}
dwRead = 0;
memset(chBuf, 0, 4096);
for (;;) {
bSuccess=ReadFile( hChildStd_ERR_Rd, chBuf, 4096, &dwRead, NULL);
if( ! bSuccess || dwRead == 0 )
break;

UString s(chBuf, dwRead);
err.append(s);
}

consoleOutput = out;
errorOutput = err;

// Wait for the process to finish. Wait shouldn't happen before reading from pipes because
// pipe writes happen only when someone is reading from them. For small amounts of data
// this would not be a problem because the Pipe Manager buffer will consume data so the
// write will succeed. But for large amounts of data, a reader must be present if not
// the writer will wait indefinitely.
WaitForSingleObject(processInfo.hProcess,INFINITE);

// Close handles returned from Child process
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);

// Close read handles of the pipe
CloseHandle(hChildStd_ERR_Rd);
CloseHandle(hChildStd_OUT_Rd);

// Get exit code for the process
DWORD exitStat = 0;
GetExitCodeProcess(processInfo.hProcess,&exitStat);

-1

Решение

Ты звонишь GetExitCodeProcess() после Вы уже закрыли hProcess обработчик, поэтому вы передаете ему неверный дескриптор, и это именно то, о чем сообщает журнал ошибок верификатора:

Неверный дескриптор исключения для текущей трассировки стека

Вам нужно уйти hProcess открывать до тех пор, пока вы полностью не используете его, что включает передачу его GetExitCodeProcess(),

4

Другие решения

Других решений пока нет …