[python]:如何通过ctypes从指针获取字符串?

1 投票
1 回答
1205 浏览
提问于 2025-04-16 23:22

事情是这样的,我写了一个程序,使用了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字符串,所以进行了错误的转换。

你可以通过以下几种方法让程序按你想要的方式运行:

  1. 使用Python 2.x版本
  2. 像这样调用EnumWindowsEnumWindows(cb_proc, b'abcd')
  3. 在这种情况下使用c_wchar_pcast(lparam, c_wchar_p)

撰写回答