CreateProcess成功,但GetLastError()返回拒绝访问

时间:2012-06-18 19:38:23

标签: c++ access-denied createprocess getlasterror

由于来自CreateProcess()GetLastError()的回复值存在冲突,我感到有些困惑。当我以类似于下面的方式使用CreateProcess()时,它会成功并且似乎完成其所需的任务。但是,GetLastError()仍然返回Access被拒绝。

如果访问被拒绝,为什么它似乎完成任务。相反,如果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(),但没有提到反转。不批评文档,只是想澄清一下。

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

2 个答案:

答案 0 :(得分:3)

来自GetLastError

的文档
  

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

我认为您获得了经验丰富的结果,因为,在成功的情况下,CreateProcess未设置错误值GetLastError返回。相反,您对GetLastError的调用将返回由前一个名为

的另一个函数设置的错误

答案 1 :(得分:1)

GetLastError仅在文档声明有意义时才有意义。

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

据记载,如果失败,CreateProcess将设置最后一个错误,如果失败则错误。所以你应该忽略它。