使用CreateProcessW

时间:2019-01-24 21:24:42

标签: python c++ visual-c++

我编写了一个C ++ GUI,该GUI生成python脚本并通过CreateProcessW调用python.exe。但是我在用C ++从我的python脚本读取sys.exit代码时遇到了麻烦。

在Python中,我有:

import sys
...code snippets...
sys.exit(1)

在C ++中,我有:

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
        pwszParam, 0, 0, false,
        CREATE_DEFAULT_ERROR_MODE, 0, 0,
        &siStartupInfo, &piProcessInfo) != false)
    {
        /* Watch the process. */
        dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
    }

但是dwExitCode(DWORD)似乎没有我想要的东西。无论脚本是否有错误和Python阻塞,或者脚本是否一直成功运行到sys.exit(1),它的值都是相同的。还有其他方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

  

无论脚本是否有错误和Python阻塞,或者脚本是否一直成功运行到sys.exit(1),它的值都是相同的。

是的,是的。 Python退出未处理的异常时返回的退出代码为1。 1表示有错误。

如果要表示成功,则该退出代码为0。这是默认退出代码,如果您让Python执行脚本完成操作,或者不使用任何参数执行sys.exit()。如果需要,您也可以明确进行sys.exit(0)


除此之外,WaitForSingleObject不会返回退出代码。看来获取退出代码的功能是GetExitCodeProcess

答案 1 :(得分:0)

返回值WaitForSingleObject仅指示对象是否正在等待实际更改的状态。它是值WAIT_ABANDONEDWAIT_OBJECT_0WAIT_TIMEOUTWAIT_FAILED之一。

如果要获取进程的退出代码,则需要调用GetExitCodeProcess

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
        pwszParam, 0, 0, false,
        CREATE_DEFAULT_ERROR_MODE, 0, 0,
        &siStartupInfo, &piProcessInfo))
{
    /* Watch the process. */
    if (WAIT_OBJECT_0 == WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000)))
    {
        if (!GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode))
        {
            // Handle error
        }
    }
    else
    {
        // Handle error
    }
}