2011-08-11 6 views
1

は事ですが、私は最初の引数としてコールバックfuncを必要とするWindows 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でエンコードするUnicode文字列として扱うPython 3を使用しているためです。しかし、それを1バイトのANSI文字列であると仮定してキャストします。

あなたは、プログラムは、次のいずれかの方法であなたが望むように動作させることができますので、同様

  1. 使用のPython 2.xの
  2. コールEnumWindowsEnumWindows(cb_proc, b'abcd')
  3. 使用c_wchar_p場合: cast(lparam, c_wchar_p)
+0

ありがとうございます。なぜ、ctypesがutf-16ではなくutf-8で文字列をエンコードするのですか? utf-8を使用すると便利ではないでしょうか? – Alcott

+1

@Alcott Windows APIでは、UTF8ではなくUTF16が使用されます。 –

関連する問題