Моя структура содержит все неподписанные элементы 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;
Следующая функция вызывает структуру
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
Вы передали 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))