ctypes MessageBoxW возвращает неожиданные китайские символы - PullRequest
0 голосов
/ 17 февраля 2019

Я использую следующий код для отображения всплывающего сообщения

if platform.system() == 'Windows':
    import ctypes

    def message_box(title, text, style):
        return ctypes.windll.user32.MessageBoxW(0, text, title, style)

if platform.system() == 'Windows':
    message_box('Error', 'Phat sinh loi Unicode, kiem tra chi tiet trong %s' % common.ERR_LOG_FILE, 0)

Когда мое приложение работает в Windows 7, всплывающее окно содержит все неожиданные символы КИТАЙСКОГО, в то время как мое исходное сообщение (во фрагменте кода) содержит только алфавитперсонажи.Это первый раз, когда я использую ctypes и совсем запутался.Кто-то, пожалуйста, объясните и помогите мне решить.

всплывающее окно

1 Ответ

0 голосов
/ 17 февраля 2019

Полагаю, вы используете 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)
...