Я пытаюсь работать с ctypes, и я не могу получить вызов FormatMessage() для правильной работы.Python - ctypes и изменяемые буферы
Вот код, который у меня есть до сих пор; Я думаю, что единственная проблема заключается в передаче изменяемого буфера; Я получаю ArgumentError от ctypes о lpBuffer
import ctypes
from ctypes.wintypes import DWORD
def main():
fm = ctypes.windll.kernel32.FormatMessageA
fm.argtypes = [DWORD,DWORD,DWORD,DWORD,ctypes.wintypes.LPWSTR(),DWORD]
dwFlags = DWORD(0x1000) # FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM
lpSource = DWORD(0)
dwMessageId = DWORD(0x05)
dwLanguageId = DWORD(0)
#buf = ctypes.wintypes.LPWSTR()
#lpBuffer = ctypes.byref(buf)
lpBuffer = ctypes.create_string_buffer(512)
nSize = DWORD(512)
res = fm(dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize)
print res
Я получаю сообщение об ошибке на аргумент lpBuffer говоря, что это неправильный тип, но я пробовал так много вариантов прохождения в буфере, как я мог думать из. Я пробовал сделать это аналогично здесь: https://gist.github.com/CBWhiz/6135237 и установить FORMAT_MESSAGE_ALLOCATE_BUFFER, а затем передать в файле LPWSTR() byref, я также попытался изменить argtype, указатель и кастинг на различные файлы LPWSTR(), c_char_p и т. Д., Но неважно что я делаю, он продолжает жаловаться.
Каков правильный синтаксис для правильной работы функции? Я знаю, что ctypes может быть finnicky, но я ничего не нашел в документации, чтобы решить проблему (я знаю, что документация использует прототип(), но я хотел бы сделать это таким образом в настоящее время)
Благодаря
Вы могли бы рассмотреть возможность использования 'win32api.FormatMessage' - это, наверное, проще, чем при использовании' ctypes', если вы можете вообще. –
Просто угадайте, как использовать 'create_unicode_buffer' вместо' create_string_buffer', так как это WCHAR? – PaulMcG
@PaulMcGuire: Гарантировано ли, что 'WCHAR' и' wchar_t' являются одним и тем же типом? В Windows я уверен, что 'WCHAR' всегда' unsigned short', несмотря ни на что, но я считаю, что 'wchar_t' может быть 32-битным в зависимости от настроек сборки. – abarnert