(я знаю, что это старый вопрос, но я думаю, что принятый ответ - это ненужный обходной путь, поэтому я хочу оставить его здесь для потомков.)
На самом деле ctypes должен явно поддерживать , используя byref()
для передачи указателя, подобного этому:
ctypes экспортирует функцию byref()
, которая используется для передачи параметров по ссылке. Тот же эффект может быть достигнут с помощью функции pointer()
, хотя pointer()
выполняет намного больше работы, поскольку создает реальный объект-указатель, поэтому быстрее использовать byref()
, если вам не нужен объект-указатель в Python сам по себе.
Вероятная причина этого в том, что вы определили свою структуру более чем в одном месте (например, в разных модулях) - если присваивание argtypes
видит одно определение, а вызов функции видит другое, возникает эта запутанная ошибка. Другими словами, ctypes пытается сопоставить два mystruct
типа, которые (возможно) идентичны по содержанию и имеют одинаковое имя, но они не являются одинаковым типом. Поскольку базовый тип структуры является объектом одного типа, не имеет значения, создаете ли вы указатель на него с помощью pointer()
, byref()
или POINTER()()
- ctypes обнаружит, что базовый (указываемый) тип такой же.
Чтобы проверить, так ли это, попробуйте assert(_lib.mymethod.argtypes[0]._type_ == type(s))
прямо перед вызовом внешней функции.