我在做一个小的单人教练。我不知道为什么ReadProcessMemory函数不起作用。通常它返回一个False或True,但在这种情况下什么也不返回。GetlastError()给出了错误代码6。
#-*- coding: cp1252 -*-
import ctypes, win32ui, win32process ,win32api
PROCESS_ALL_ACCESS = 0x1F0FFF
HWND = win32ui.FindWindow(None,"Solitär").GetSafeHwnd()
print(HWND)
PID = win32process.GetWindowThreadProcessId(HWND)[1]
print(PID)
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
rPM = ctypes.windll.kernel32.ReadProcessMemory
wPM = ctypes.windll.kernel32.WriteProcessMemory
ADDRESS1 = 0x00E97074
ADDRESS2 = ctypes.create_string_buffer(64)
pi = ctypes.pointer(ADDRESS2)
rPM(PROCESS,ADDRESS1,ADDRESS2,64,0)
print(ADDRESS2)
x=ctypes.windll.kernel32.GetLastError()
print(x)
查看MSDN ReadProcessMemory页面的社区注释,引用(sic):
还要完全声明返回类型并使用
use_last_error
参数,其中ctypes
将在调用后直接在内部缓存GetLastError()
值。否则,可能不正确。如果您在64位系统上,那么SIZE_T和指针是64位值,因此ctypes需要知道类型,以便为调用正确设置堆栈。另外,仅供参考,即使所有的修复都得到相同的错误值,但我没有经历启用
SE_DEBUG_NAME
的麻烦。已解决
以下是问题所在:
win32api.OpenProcess
返回一个临时的PyHANDLE
,该临时的PyHANDLE
被销毁,并在检索到句柄后关闭句柄。解决方法是使用:
PROCESS
然后保存PyHANDLE
对象,句柄保持有效。相关问题 更多 >
编程相关推荐