[python]: как получить строку из указателя с помощью ctypes? - PullRequest
1 голос
/ 11 августа 2011

Вот в чем дело, я написал программу, использующую 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 голосов
/ 11 августа 2011

Потому что вы используете Python 3, который обрабатывает abcd как строку Unicode, которая ctypes кодирует с UTF-16.Но затем вы приводите его, предполагая, что это однобайтовая строка ANSI.

Вы можете заставить программу вести себя так, как вам нужно, одним из следующих способов:

  1. Использовать Python 2.x
  2. Звоните EnumWindows примерно так: EnumWindows(cb_proc, b'abcd')
  3. Используйте c_wchar_p в случае: cast(lparam, c_wchar_p)
...