[英]How to get a sub-process' return code
What is the method of getting the return value from spawning a sub-process within windows? 从Windows中生成子流程获取返回值的方法是什么? It looks like ShellExecute()
is simpler to use than is CreateProcess()
, but from the reading I've done thus far, neither indicate how to check the return value of the spawned process. 看起来ShellExecute()
比CreateProcess()
更易于使用,但是从我到目前为止所做的阅读来看,它们都没有指出如何检查生成进程的返回值。 How is that done? 怎么做的?
Thanks, Andy 谢谢,安迪
To acquire the exit code of a process on Windows you can use GetExitCodeProcess()
. 要在Windows上获取进程的退出代码,可以使用GetExitCodeProcess()
。
Example application that accepts the process id as an argument and waits for five seconds for it to complete and then acquires its exit code: 接受进程id作为参数的示例应用程序,等待五秒钟完成,然后获取其退出代码:
int main(int a_argc, char** a_argv)
{
int pid = atoi(*(a_argv + 1));
HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid);
if (NULL != h)
{
WaitForSingleObject(h, 5000); // Change to 'INFINITE' wait if req'd
DWORD exit_code;
if (FALSE == GetExitCodeProcess(h, &exit_code))
{
std::cerr << "GetExitCodeProcess() failure: " <<
GetLastError() << "\n";
}
else if (STILL_ACTIVE == exit_code)
{
std::cout << "Still running\n";
}
else
{
std::cout << "exit code=" << exit_code << "\n";
}
CloseHandle(h);
}
else
{
std::cerr << "OpenProcess() failure: " << GetLastError() << "\n";
}
return 0;
}
Here is a complete code based in http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx and the solution of hmjd: 这是一个完整的代码,基于http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx和hmjd的解决方案:
#include <stdio.h>
#include <Windows.h>
int main()
{
const size_t stringSize = 1000;
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD exit_code;
char commandLine[stringSize] = "C:\\myDir\\someExecutable.exe param1 param2";
WCHAR wCommandLine[stringSize];
mbstowcs (wCommandLine, commandLine, stringSize);
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
wCommandLine, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError() );
return -1;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
GetExitCodeProcess(pi.hProcess, &exit_code);
printf("the execution of: \"%s\"\nreturns: %d\n", commandLine, exit_code);
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
}
(runs as VS2005 console application in windows XP) (在Windows XP中作为VS2005控制台应用程序运行)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.