-1

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);
4

1 に答える 1

4

ハンドルを既に閉じたGetExitCodeProcess() に呼び出してhProcessいるため、無効なハンドルを渡しています。これは、ベリファイアのエラー ログが伝えていることとまったく同じです。

現在のスタック トレースのハンドル例外が無効です

hProcessへの引き渡しを含め、完全に使い終わるまで開いたままにしておく必要がありますGetExitCodeProcess()

于 2016-08-19T22:44:36.580 に答える