我维护代码只是在他们退休之前编写的代码,这意味着我找不到他们提问。 :-)这基本上是一个启动程序的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。
答案 0 :(得分:3)
作为一个概念验证黑客,我只是将当前的PID添加到文件名的末尾,一切都运行得很好。现在我只需要确定真正的修复,我认为可能完全摆脱整个bat文件机制并直接调用应用程序。
呼!谢谢各位的帮助!可悲的是,我所包含的一些代码没有违规行,但上面的每个人的提示都帮助我缩小了问题范围。 : - )