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

2019-06-25 14:18发布

我有一点点混乱,由于从冲突返回值CreateProcess()GetLastError() 当我使用CreateProcess()在类似下面的方式,它成功并出现以完成其所需的任务。 然而, GetLastError()仍然返回访问被拒绝。

如果访问被拒绝,为什么它会完成任务。 相反,如果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()失败? 谢谢。

Answer 1:

从文档GetLastError

对于设置最后的错误代码的每个函数的文档的返回值节指出其下的函数设置的最后一个错误代码的条件。 设置该线程的最后一个错误代码大部分功能设置,当他们失败。 但是, 某些功能还设置了最后的错误代码时,他们成功了 。 [重点煤矿]

我觉得你得到的经验的结果,因为,uppon成功, CreateProcess不设定误差值GetLastError返回。 相反,你要调用GetLastError返回由以前叫另一个函数设置错误



Answer 2:

GetLastError是唯一有意义的,当文档指出它是有意义的。

GetLastError返回的Win32线程最后一个错误设置SetLastError 。 由于功能只应该设置或清除最后一个错误,当它被记录在案,他们这样做,如果没有发生,最后的错误可能包含以前的错误是不相关的。

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



文章来源: CreateProcess succeeds, but GetLastError() returns access denied