Синтаксис объединения внутри структуры в ctypes - PullRequest
8 голосов
/ 13 августа 2010

Быстрый вопрос о синтаксисе ctypes, так как документация для Unions не понятна для такого новичка, как я.

Скажем, я хочу реализовать структуру INPUT (см. здесь ):

typedef struct tagINPUT {
  DWORD type;
  union {
    MOUSEINPUT    mi;
    KEYBDINPUT    ki;
    HARDWAREINPUT hi;
  } ;
} INPUT, *PINPUT;

Должен ли я или мне нужно изменить следующий код?

class INPUTTYPE(Union):
    _fields_ = [("mi", MOUSEINPUT),
                ("ki", KEYBDINPUT),
                ("hi", HARDWAREINPUT)]

class INPUT(Structure):
    _fields_ = [("type", DWORD),
                (INPUTTYPE)]

Не уверен, что у меня может быть безымянное поле для объединения, но добавляется имя, которое не определено вWin32API кажется опасным.

Спасибо,

Майк

1 Ответ

8 голосов
/ 14 августа 2010

Ваш синтаксис структуры недопустим:

AttributeError: '_fields_' must be a sequence of pairs

Я считаю, что вы хотите использовать анонимный атрибут в вашем ctypes.Structure.Похоже, что документация ctypes создает структуру TYPEDESC (которая по конструкции очень похожа на tagINPUT).

Также обратите внимание, что вам нужно определить DWORD как базовый тип для вашегоплатформы.

...