GetExitCodeProcess有没有办法将退出代码设置为错误的值?

时间:2013-06-01 00:19:18

标签: c++ kernel32

我维护代码只是在他们退休之前编写的代码,这意味着我找不到他们提问。 :-)这基本上是一个启动程序的C ++包装器。有问题的代码块是这样的:

BOOL bSuccess = CreateProcess(NULL, (char *)strBatFile.c_str(),
    NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, strLocalWorkingDir.c_str(), &si,  &pi );

   if( bSuccess )
   {
      DWORD dwMillisec = INFINITE;      
      DWORD dwWaitStatus = WaitForSingleObject( pi.hProcess, dwMillisec );

      if( dwWaitStatus == WAIT_OBJECT_0 )
      {
         DWORD dwExitCode = NULL;
         GetExitCodeProcess( pi.hProcess, &dwExitCode );
         nRet = (int)dwExitCode;
        }

      CloseHandle( pi.hThread );
      CloseHandle( pi.hProcess );
   }
   else
      nRet = START_PROCESS_FAILED;

如果一次只运行一个实例,它总能正常工作。但是,如果在很短的时间内运行多个,那么大约一半的dwExitCode设置为1而不是0,即使进程没有崩溃,内部程序写入的日志文件也在完成。

所以要澄清一下,这个过程总是很好,并且总是进入if语句,但它是由GetExitCodeProcess设置的dwExitCode的值,它不包含预期的值。由于我们对此进行了错误检查,因此当它们实际上很好时,我们将这些运行标记为不完整。

是否有任何方法可以将此值设置为与进程退出代码不同的值?和/或是否有一个实用程序,我可以同时运行以确认退出代码是我认为他们是什么?

谢谢!

ETA:刚刚意识到这是将内部程序调用放在.bat文件中 - “C:\\ --flags etc ...”然后将其作为命令行调用第二个参数,而不是直接使用lpApplicationName调用它。不知道这是否有所作为!但是当我打印进程的PID时,我可以看到它是cmd.exe进程的PID,然后我们的程序有一个子PID。但是,当我在Process Monitor中跟踪时,我可以看到父和子都退出,退出代码为0。

1 个答案:

答案 0 :(得分:3)

发现它!应用程序本身实际上返回了一个0错误代码......它周围的shell返回1.这是由于第二个参数中的.bat文件。该名称是从时间生成的,因此如果多个实例运行得太紧密,它最终会成为完全相同的名称。这就是内部应用程序运行良好的原因......总有一个带有该名称的bat文件。但是,根据我的判断,当不同的实例试图生成或清理蝙蝠时会发生访问冲突。

作为一个概念验证黑客,我只是将当前的PID添加到文件名的末尾,一切都运行得很好。现在我只需要确定真正的修复,我认为可能完全摆脱整个bat文件机制并直接调用应用程序。

呼!谢谢各位的帮助!可悲的是,我所包含的一些代码没有违规行,但上面的每个人的提示都帮助我缩小了问题范围。 : - )