【发布时间】:2012-06-18 19:38:23
【问题描述】:
由于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() 文档中,它提到当CreateProcess() 失败时使用GetLastError(),但没有提到相反的情况。不批评文档,只是想澄清一下。
无论CreateProcess() 中的第二个参数是否为NULL,都会发生这种情况。也许它与cmd.exe 权限有关?如果是这样,CreateProcess() 不应该失败吗?谢谢。
【问题讨论】:
-
是的,您对
GetLastError的使用不正确。你应该只在CreateProcess失败时使用它。CreateProcess可能(并且确实)使用可以设置最后一个错误的 API,并且没有义务将其重置为 0,因为它返回一个指示成功的值。 -
感谢您的回复。我只是将它重置为零以表明它不能来自 CreateProcess() 之前的函数
标签: c++ access-denied createprocess getlasterror