Python Ctype inicializando una estructura

Mi estructura contiene todos los elementos char sin firmar.

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; 

La siguiente función llama a la estructura

 extern int WriteCMessage(HANDLE hDev,CMsg* pMsg); 

Convertí esta estructura a 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') 

Luego cargué el archivo dll

 hllDll.WriteCANMessage(handle, pmsg) 

Pero esto da error.

Error: Infracción de acceso en 0x00000000

Pasó pmsg por valor, pero la función espera un puntero. Dado que ha inicializado a todos los ceros, la función termina desreferenciando un puntero NULL . Luego, ctypes usa Windows SEH para enrutar la infracción de acceso a una excepción de Python.

byref(pmsg) usar byref(pmsg) para pasar una referencia. Además, defina los argtypes la función para garantizar el manejo adecuado del puntero en sistemas de 64 bits.

 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))