2016-07-11 36 views
1

我在当前登录的用户会话中使用API​​函数GetExitCodeProcess来监视进程的退出代码。此过程在另一个会话(SYSTEM)中运行。 函数立即返回,退出代码为0. 我不认为这是正确的。GetExitCodeProcess无法在另一个会话中运行进程?

任何人都可以告诉如果这个函数总是会失败/如果进程已经在不同的会话中启动,会给出错误的结果吗?

我的VB6的代码是这样的,如果有人有兴趣:

Public Function GetProcExitCode(ByVal uProcID As Long) As Long 

    Const STILL_ACTIVE = &H103& 
    Const PROCESS_QUERY_INFORMATION = &H400& 

    Dim lProcHnd As Long 
    lProcHnd = OpenProcess(PROCESS_QUERY_INFORMATION, True, uProcID) 

    Dim lTick As Long 
    lTick = GetTickCount 

    Dim lRet& 
    lRet = 0 

    'Wait for process end 
    Do 

     GetExitCodeProcess lProcHnd, lRet 

    Loop While lRet = STILL_ACTIVE 

    CloseHandle lProcHnd 

    GetProcExitCode = lRet 

    Dim lTicks& 
    lTicks = GetTickCount() - lTick 

    WriteLog "!!! GetExitCodeProcess needed " & lTicks & " ms." 

End Function 

谢谢。

+0

您可能没有必要的权限来打开该过程。 –

回答

1

Microsoft MSDN

返回值

如果函数成功,返回值是非零。

如果函数失败,返回值为零。要获得扩展的错误信息,请调用GetLastError。


给出返回值为零似乎是一个错误。

+0

你的回答很好,我完全忽略了这一点。也许有人可以提供更多的见解,否则我会接受你的答复作为答案。非常感谢你! – tmighty

+0

我认为这需要更多的洞察力。该进程退出时返回值为0,并且GetLastError返回0,所以这不可能是正确的。如果进程成功退出,它不会返回0,如果不成功,GetLastError将返回非零值。对? – tmighty

+0

也许我现在真的很笨,但我经常使用GetExitCodeProcess,对我而言,成功的是返回值为0.我在MSDN中发现了一个很大的缺陷,或者我应该洗脑。 – tmighty

相关问题