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

1

Моя структура содержит все неподписанные элементы 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

Теги:
ctypes

1 ответ

3
Лучший ответ

Вы передали 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))
  • 0
    Но этот метод закрывает программу python говорит, что возникла проблема с python.exe и необходимо закрыть
  • 0
    Это новая проблема. Вы должны будете добавить больше контекста к вопросу.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню