我正在维护某人退休前编写的代码,这意味着我找不到他们来提问。:-) 这基本上是一个用于启动程序的 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...”,然后在第二个参数中将其作为命令行调用,而不是直接使用lp应用程序名称。不知道这是否有所作为!但是当我打印进程的 PID 时,我可以看到它是 cmd.exe 进程的 PID,然后我们的程序有一个子 PID。但是,当我在 Process Monitor 中进行跟踪时,我可以看到父母和孩子都以退出代码 0 退出。