Полагаю, вы используете Python 2. Строки Python 2 являются байтовыми строками и маршалируются как байтовые строки (char*
).Строки Python 3 являются строками Unicode и маршалируются как широкие строки (wchar_t*
).Без определения .argtypes
, ctypes
не проверит ошибки и с радостью передаст неверный тип.
Чтобы вызвать MessageBoxW
в Python 2, вместо этого передайте строки Unicode, но лучше определить .argtypes
и .restype
так что ctypes
может напечатать check и сообщить вам, когда параметр неверен:
#python2
import ctypes
from ctypes import wintypes as w
user32 = ctypes.WinDLL('user32')
MessageBox = user32.MessageBoxW
MessageBox.argtypes = w.HWND,w.LPCWSTR,w.LPCWSTR,w.UINT
MessageBox.restype = ctypes.c_int
MessageBox(None, u'message', u'title', 0)