1

CreateProcess()由于和的返回值冲突,我有点困惑GetLastError()。当我CreateProcess()以类似于下面的方式使用时,它成功并且似乎完成了它所需的任务。然而,GetLastError()仍然返回 Access is Denied。

如果访问被拒绝,为什么它似乎完成了任务。相反,如果CreateProcess()成功,为什么GetLastError()返回访问被拒绝?

还是我的用法GetLastError()不正确?我只应该在CreateProcess()返回失败值时使用它吗?(我对以下行为的理由是我认为安全总比抱歉好)

    SetLastError(0);
    hello = CreateProcess(_T("C:\\Windows\\System32\\cmd.exe"), 
        _T("C:\\Windows\\System32\\cmd.exe /C ant debug"),
        NULL,NULL,false,0,NULL,
        _T("C:\\My\\Directory"),&siStartupInfo, &piProcessInfo);
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER 
        |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(), 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        (LPTSTR)&errorText, 0, NULL); 
    AfxMessageBox(errorText);

这种行为正常吗?在CreateProcess()文档中,它提到了GetLastError()CreateProcess()失败时使用,但没有提到相反的情况。不批评文档,只是想澄清一下。

无论 in 的第二个参数是否存在,都会发生这种CreateProcess()情况NULL。也许它与cmd.exe权限有关?如果是这样,不应该CreateProcess()失败吗?谢谢你。

4

2 回答 2

3

从文档GetLastError

设置最后一个错误代码的每个函数的文档的返回值部分记录了函数设置最后一个错误代码的条件。大多数设置线程最后错误代码的函数在失败时都会设置它。但是,某些函数在成功时也会设置最后一个错误代码。[强调我的]

我认为您会获得经验丰富的结果,因为成功后CreateProcess不会设置错误值GetLastError返回。相反,您的调用会GetLastError返回由之前调用的另一个函数设置的错误

于 2012-06-18T19:46:39.457 回答
1

GetLastError只有当文档说明它有意义时才有意义。

GetLastError返回用 设置的 Win32 线程最后一个错误SetLastError。由于函数只应该在记录它们这样做时设置或清除最后一个错误,如果没有发生,最后一个错误很可能包含一个不相关的早期错误。

据记录,CreateProcess如果失败,将设置最后一个错误,而不是如果成功。所以你应该忽略它。

于 2012-06-18T19:45:22.640 回答