[python]:如何使用ctypes从指针中获取字符串?

时间:2011-08-11 08:58:15

标签: python pointers ctypes

这是事情,我用windows api EnumWindows编写了一个程序,它需要一个回调函数作为第一个arg,我的可怜代码如下:

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 个答案:

答案 0 :(得分:2)

因为你使用的是Python 3,它将abcd视为一个Unicode字符串,它使用UTF-16进行ctypes编码。但是,假设它是单字节ANSI字符串,那么你将它转换为它。

您可以通过以下方法之一使程序按您希望的方式运行:

  1. 使用Python 2.x
  2. 如此致电EnumWindowsEnumWindows(cb_proc, b'abcd')
  3. 在案例中使用c_wchar_pcast(lparam, c_wchar_p)