python ctype, инициализирующий структуру

Моя структура содержит все неподписанные элементы char

typedef struct { unsigned char bE; unsigned char cH; unsigned char cL; unsigned char EId1; unsigned char EId0; unsigned char SId1; unsigned char SId0; unsigned char DLC; unsigned char D0; unsigned char D1; unsigned char D2; unsigned char D3; unsigned char D4; unsigned char D5; unsigned char D6; unsigned char D7; } CMsg; 

Следующая функция вызывает структуру

  • WindowsError: при загрузке DLL с помощью ctypes
  • Получение емкости аккумулятора Windows с Python
  • Установить атрибут «скрыть» на папки в ОС Windows?
  • ctypes - Новичок
  • Сортировка списка строк с определенной локалью в python
  • вызов c из python с помощью ctypes: проходящих векторов
  •  extern int WriteCMessage(HANDLE hDev,CMsg* pMsg); 

    Я преобразовал эту структуру в python ctype

     class CMsg(Structure): _fields_ = [('bE', c_char), ('cH', c_char), ('cL', c_char), ('EId1', c_char), ('EId0', c_char), ('SId1', c_char), ('SId0', c_char), ('DLC', c_char), ('D0', c_char), ('D1', c_char), ('D2', c_char), ('D3', c_char), ('D4', c_char), ('D5', c_char), ('D6', c_char), ('D7', c_char)] pmsg = CMsg('\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00') 

    Затем я загрузил файл dll

     hllDll.WriteCANMessage(handle, pmsg) 

    Но это дает ошибку

    Ошибка: нарушение доступа при 0x00000000

  • Как работать с зависимостями Linux / Python?
  • Как использовать append с pickle в python?
  • Как мой вход не соответствует ответу?
  • Как добавить несколько значений в ключ словаря в python?
  • Как изменить имя тега с помощью BeautifulSoup?
  • Добавление поддержки SSL в SocketServer
  • One Solution collect form web for “python ctype, инициализирующий структуру”

    Вы передали pmsg по значению, но функция ожидает указатель. Поскольку вы инициализировали все нули, функция заканчивает разыменование указателя NULL . Затем ctypes использует Windows SEH для маршрутизации нарушения доступа к исключению Python.

    Вам нужно использовать byref(pmsg) для передачи ссылки. Кроме того, определите argtypes функции, чтобы обеспечить правильную обработку указателя на 64-битных системах.

     from ctypes import * from ctypes.wintypes import * class CMsg(Structure): _fields_ = [ ('bE', c_ubyte), ('cH', c_ubyte), ('cL', c_ubyte), ('EId1', c_ubyte), ('EId0', c_ubyte), ('SId1', c_ubyte), ('SId0', c_ubyte), ('DLC', c_ubyte), ('D0', c_ubyte), ('D1', c_ubyte), ('D2', c_ubyte), ('D3', c_ubyte), ('D4', c_ubyte), ('D5', c_ubyte), ('D6', c_ubyte), ('D7', c_ubyte)] hllDll = cdll... hllDll.WriteCANMessage.argtypes = [HANDLE, POINTER(CMsg)] handle = ... pmsg = CMsg() # initially memset to {0} hllDll.WriteCANMessage(handle, byref(pmsg)) 
    Python - лучший язык программирования в мире.