MFC GetLastError 返回 5(拒绝访问)
Posted
技术标签:
【中文标题】MFC GetLastError 返回 5(拒绝访问)【英文标题】:MFC GetLastError return 5 (Access denied) 【发布时间】:2014-05-27 07:41:54 【问题描述】:我正在构建 MFC 对话框应用程序。
我使用 Visual Studio 2010、MFC 2008/2010。
在我的 cpp 文件中,我有一些代码来获取进程的信息。进程用户名为SYSTEM
。
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, 0); // 0 is my process id
DWORD testerror = GetLastError();
// Get the process name.
if (NULL != hProcess )
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
GetModuleBaseName( hProcess, hMod, namestr,
sizeof(namestr)/sizeof(TCHAR) );
else
MessageBox(L"", L"", MB_OK);
CloseHandle();
结果显示 MessageBox,因为句柄为 NULL。 我得到 GetLastError() 并返回 5(访问被拒绝)。 我不知道为什么?非常感谢!
【问题讨论】:
FormatMessage() 会将 GetLastError() 的整数返回值映射为更丰富的错误描述。这可能会对你有所帮助。 您阅读过OpenProcess 的文档吗?您似乎无法以这种方式访问系统进程。 在0 is my process id
中,“我的”是什么意思?是另一个进程的ID还是当前进程?后一种情况,根本不需要打开进程,直接使用GetCurrentProcess
即可。
@acraig5075:我得到了 func GetlastError() 的结果,我得到了错误代码 5 的含义。它的访问被拒绝。现在我只想修复它:(
@TheForestAndTheTrees:是的。我无法访问系统进程。你能帮我吗?请!谢谢
【参考方案1】:
system idle process
和其他一些系统进程不允许获取他们的信息。
系统空闲进程 (ID 0) 包含在名为 [System Process] 的快照中,您无法为其打开句柄,因为 OpenProcess 的文档特别说明:
If the specified process is the System Process (0x00000000), the function fails and the last error code is ERROR_INVALID_PARAMETER. If the specified process is the Idle process or one of the CSRSS processes, this function fails and the last error code is ERROR_ACCESS_DENIED because their access restrictions prevent user-level code from opening them.
【讨论】:
嗯,这就是我的问题。似乎进程的 id 为 0,而 4 不允许获取信息。是真的吗? 谢谢:)。因此,对于一些其他系统进程,我确实喜欢这样来获取进程信息。项目 -> MyProject 属性 -> 配置属性 -> 链接器 -> 清单文件 -> UAC 执行级别 -> 将“asInvoler”更改为“requireAdministrator”。它工作。我很困惑,不知道有另一种配置方式(通过命令,而不是手动配置)。谢谢! :) 我认为您可以在 *** 上发布有关此 UAC 的另一个问题。 :)以上是关于MFC GetLastError 返回 5(拒绝访问)的主要内容,如果未能解决你的问题,请参考以下文章
VC++ 2008,OpenProcess 总是返回错误 5(拒绝访问)
GlobalAddAtom() 在 Win7 上返回 0 和 GetLastError = 0x5,适用于 XP
MFC CFindFile :: FindNextFile用法