【问题标题】:EnumProcessModules failed with error 299 on 32bit win7EnumProcessModules 在 32 位 win7 上失败,错误 299
【发布时间】:2013-05-27 05:55:53
【问题描述】:

我的代码在win7 32bit上运行,但是当我使用EnumProcessModules时,它返回false,getlasterror()返回错误码299,声明程序是32bit,这个语句不能在64bit系统上运行。

我想知道为什么会这样,为什么系统认为我在 64 位操作系统上运行?

我使用的代码:

         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
         if (hProcess)
         {
            HMODULE hMod = NULL;
            DWORD cbNeeded = 0;
            if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
            {
              //do something here...
            }
         }

dwPid 是我要操作的进程的 id。

PS.这个错误只发生在我的一台测试机器上,其他都很好。那么这个问题可能与特定的机器或系统配置有关?

【问题讨论】:

  • 你的标题是EnumProcessModulesEx,正文是EnumProcessModules。它是哪一个?这两个都返回BOOL,所以我也不确定“返回错误代码299”是什么意思。您的意思是“失败后,GetLastError 返回 299”?请edit您的问题包含您的代码并更清楚您的要求。
  • 好吧,你得到了一半。谢谢。 :-) 再次,请包含您的代码。如果我们一开始看不到您在做什么,就很难说可能出了什么问题。
  • 我觉得我在这里拔牙了。 :-) 在您发布的代码中没有对GetLastError 的调用,因此您无法使用此代码收到“错误 299”,这意味着它不是您正在使用的实际代码(或者您的问题是由第一名)。如果您需要帮助,请发布您的代码以便我们提供帮助。
  • 这确实是我的代码,其中包含 GetLastError 的版本是我用来定位错误的版本。代码看起来很简单,这就是我感到困惑的原因。这个错误只发生在我的一台测试机器上,其他都很好。
  • 来自 MSDN:如果这个函数是从运行在 WOW64 上的 32 位应用程序调用的,它只能枚举 32 位进程的模块。如果进程是 64 位进程,则此函数失败,最后一个错误代码为 ERROR_PARTIAL_COPY (299)。 msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c++ winapi windows-7


【解决方案1】:

虽然你发布这个问题已经有一段时间了。但我想试一试。

原因可能是因为您在代码中使用了 CreateProcessA.. 突然调用 EnumProcessModules.Thus 到那时 windows 无法创建 ModuleInfo。它返回错误 299(认为它是 64 位系统.. 因为它失败了读取内存)。

实际上我也被困在这个问题上并想通了..在看了你的帖子之后。 谢谢

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx CreatProcess 备注.. 它要求在继续之前调用 WaitforInput Idle。;-)

调用线程可以使用 WaitForInputIdle 函数来等待,直到新进程完成其初始化并等待用户输入,没有输入挂起。这对于父进程和子进程之间的同步很有用,因为 CreateProcess 无需等待新进程完成其初始化即可返回。例如,创建进程会在尝试查找与新进程关联的窗口之前使用 WaitForInputIdle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多