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(拒绝访问)的主要内容,如果未能解决你的问题,请参考以下文章

Windows GetLastError()返回值

VC++ 2008,OpenProcess 总是返回错误 5(拒绝访问)

GlobalAddAtom() 在 Win7 上返回 0 和 GetLastError = 0x5,适用于 XP

MFC CFindFile :: FindNextFile用法

远程线程注入 CreateRemoteThread 返回NULL

MFC CDialog::Create 失败