2011-08-11 12 views
1
여기

는 일이, 내가 첫 번째 인수로 콜백 FUNC를 필요로 윈도우 API를 EnumWindows를 사용하여 프로그램을 작성, 다음과 같이 불쌍한 내 코드는 다음과 같습니다[python] : ctypes를 사용하여 포인터에서 문자열을 가져 오는 방법은 무엇입니까?

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 '가 아닌가요?

답변

2

abcd을 ctypes가 UTF-16으로 인코딩하는 유니 코드 문자열로 처리하는 Python 3을 사용하고 있기 때문입니다. 그런 다음 1 바이트 ANSI 문자열이라고 가정하고 캐스팅합니다.

당신은 프로그램이 다음 방법 중 하나를 사용하여 원하는 방식으로 행동 할 수

:

  1. 사용 파이썬 2.x는
  2. 전화 EnumWindows 그래서 같은 경우 EnumWindows(cb_proc, b'abcd')
  3. 사용 c_wchar_p를 : cast(lparam, c_wchar_p)
+0

대단히 감사합니다. BTW, 왜 ctypes가 utf-16이 아닌 utf-8로 문자열을 인코딩합니까? utf-8을 사용하는 것이 편리하지 않습니까? – Alcott

+1

@Alcott Windows API는 UTF8이 아닌 UTF16을 사용합니다. –

관련 문제