ctypes cdecl дает 4 байта при вызове gcc скомпилированной dll, возвращающей структуру

У меня есть библиотека ac (chipmunk), которую я хочу вызвать с помощью ctypes. Однако он не работает на функции, которые возвращают структуру?

Ошибка, которую я получаю

File "qw.py", line 19, in <module> b = cpBBNew3(1,2,3,4) ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention 

Это (соответствующий) c-код: в cpBB.h

 typedef struct cpBB { cpFloat l, b, r ,t; } cpBB; cpBB cpBBNew3(cpFloat l, cpFloat b, cpFloat r, cpFloat t); 

в cpBB.c

 cpBB cpBBNew3(cpFloat l, cpFloat b, cpFloat r, cpFloat t) { cpBB bb = {l, b, r, t}; return bb; } 

скомпилированный с

gcc -O3 -std = gnu99 -shared -c

gcc -O3 -std = gnu99 -shared -s

Тогда питон выглядит

 from ctypes import * chipmunk_lib = cdll.LoadLibrary('''C:/code/pymunk/trunk/pymunk/chipmunk.dll''') class cpBB(Structure): pass cpBB._pack_ = 4 cpBB._fields_ = [ ('l', c_double), ('b', c_double), ('r', c_double), ('t', c_double), ] cpBBNew3 = chipmunk_lib.cpBBNew3 cpBBNew3.restype = cpBB cpBBNew3.argtypes = [c_double, c_double, c_double, c_double] b = cpBBNew3(1,2,3,4) 

Этот конкретный пример работает, если я компилирую с -mrtd и использую windll (используя stdcall). Однако использование stdcall во всей библиотеке создает ошибки сегментации в других частях библиотеки при компиляции с оптимизацией и новой версией GCC, поэтому было бы неплохо заставить работать cdecl.

One Solution collect form web for “ctypes cdecl дает 4 байта при вызове gcc скомпилированной dll, возвращающей структуру”

В зависимости от размера структуры и компилятора / платформы, cdecl может возвращать структуры, передавая скрытый указатель на выделенную вызовом структуру до обычных параметров. Попробуйте следующее:

 b = cpBB() cpBBNew3(byref(b),1,2,3,4) 
  • pickle.load () повышение EOFError в Windows
  • Где можно скачать бинарные яйца с psycopg2 для Windows?
  • Как удалить консоли Windows из порожденных процессов в Python (2.7)?
  • Получить список открытых окон в Python
  • Открыть файл из диалогового окна файла Windows с помощью python автоматически
  • Как изменить иконки папок с помощью Python на окнах?
  • Ошибка Python: VLC
  • Проблемы с буфером обмена в Python
  • Python - лучший язык программирования в мире.