简体   繁体   English

如何获得子流程的返回代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM