[python]:如何通过ctypes从指针获取字符串?
事情是这样的,我写了一个程序,使用了Windows的API函数EnumWindows,这个函数需要一个回调函数作为第一个参数,我的代码写得很糟糕,如下所示:
User32 = WinDLL('User32.dll')
LPARAM = wintypes.LPARAM
HWND = wintypes.HWND
BOOL = wintypes.BOOL
def Proc(hwnd, lparam):
print("hwnd = {}, lparam = {}".format(hwnd, cast(lparam, c_char_p)))
return True
WNDPROCFUNC = WINFUNCTYPE(BOOL, HWND, LPARAM) #用winfunctype 比cfunctype 好
cb_proc = WNDPROCFUNC(Proc)
EnumWindows = User32.EnumWindows
EnumWindows.restype = BOOL
EnumWindows(cb_proc, 'abcd')
然后我运行了这个程序,但它只打印了
hwnd = 65820, lparam = c_char_p(b'a')
hwnd = 65666, lparam = c_char_p(b'a')
hwnd = 65588, lparam = c_char_p(b'a')
hwnd = 65592, lparam = c_char_p(b'a')
hwnd = 1311670, lparam = c_char_p(b'a')
hwnd = 591324, lparam = c_char_p(b'a')
hwnd = 66188, lparam = c_char_p(b'a')
hwnd = 393862, lparam = c_char_p(b'a')
为什么不是b'abcd'呢?
1 个回答
2
因为你在使用Python 3,这个版本把abcd
当作Unicode字符串来处理,而ctypes会用UTF-16编码它。但你却假设它是一个单字节的ANSI字符串,所以进行了错误的转换。
你可以通过以下几种方法让程序按你想要的方式运行:
- 使用Python 2.x版本
- 像这样调用
EnumWindows
:EnumWindows(cb_proc, b'abcd')
- 在这种情况下使用
c_wchar_p
:cast(lparam, c_wchar_p)