【问题标题】:Python - win32api GetModuleHandle error "the specified module could not be found"Python - win32api GetModuleHandle 错误“找不到指定的模块”
【发布时间】:2013-11-06 21:09:05
【问题描述】:

我正在使用下面的代码来获取有关正在运行的进程的一些信息。但是,我似乎无法使用模块名称来执行功能。例如,一旦下面的代码到达win32api.GetModuleHandle(fileName),它就会崩溃,说明the specified module could not be found。关于我如何解决这个问题的任何建议?非常感谢!

代码:

processName = "MyProcess"
PROCESS_ALL_ACCESS = 0x1F0FFF
hwnd = win32ui.FindWindow(None, processName).GetSafeHwnd()
pid = win32process.GetWindowThreadProcessId(hwnd)[1]
processHandle = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid)
modules = win32process.EnumProcessModules(processHandle)
for module in modules:
    fileName = win32process.GetModuleFileName(processHandle, module)
    print('{:08X}'.format(module))
    print(fileName)
    print(win32api.GetModuleHandle(fileName))

processHandle.close()

编辑:

第一个答案让我意识到我的“找不到指定的模块”有点模棱两可。这是一个 win32 模块错误,而不是 python 模块错误。一切都很好地导入了python(为简洁起见,我只是省略了导入)。问题在于print(win32api.GetModuleHandle(fileName)) 行。更详细的错误是pywintypes.error: (126, 'GetModuleHandle', 'The specified module could not be found.')

【问题讨论】:

  • 您究竟想在这里做什么,而仅使用原始 module 值是无法做到的?
  • @abamert:我当时实际上只是在玩弄这些功能,想知道哪里出了问题。我最终会想要获得用于 ReadProcessMemory 目的的进程的基地址,但这不是我在这里专门做的。
  • 如果您正在尝试构建一个作弊程序或培训师制造商,您可能想要搜索已经存在的内容。那里有多个模块,虽然它们可能不完整和/或过时,但有很多有用的资源可以显示如何完成大部分困难部分。 (其中一个是我大约十年前放弃的一个项目,它包含了 OS X、linux 2.x 和 Win32 中的类似功能,后来我发现其他人已经分叉并恢复了它,但后来又放弃了……不幸的是,我可以'不记得他的叉子的名字。)
  • @abarnert:我正在努力获取一些东西来读取游戏值,但特别是为了我可以为游戏编写一个 AI。我想一个 python 模块可以将工作从与进程的连接中取出并读取所有必要的内存会很有用,但我需要从那里获取 if。

标签: python winapi python-3.x pywin32


【解决方案1】:

问题是你从一个不同的进程中获取一个句柄,获取它的文件名,然后在你的进程中请求相同的文件名句柄。

除非您碰巧已经在您的进程中打开了该模块,否则您的进程中没有这样的句柄。正如GetModuleHandle 文档解释的那样,“模块必须已由调用进程加载”(即由您)。

如果要打开模块,请使用LoadLibrary

如果您想要其他进程的句柄……那么,您已经拥有了。如果您需要获取具有不同访问权限或其他内容的句柄,请说明您实际需要做什么,并且可能是可行的。

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 2015-12-22
    • 2020-06-30
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多