我相信基本流程是:
from ctypes import *
LEAP = ctypes.CDLL('leap.dylib')
leap_controller = LEAP.leap_controller
leap_controller.res_type = c_void_p
leap_controller_dispose = LEAP.leap_controller_dispose
leap_controller_dispose.argtype = [c_void_p]
但是,当我调用此代码时,它会破坏 void * 指针。从相关的 C 代码调试,我得到:
doug:test doug$ python test.py
Controller init!
returning: 0x7fcf9a0022c0
Created controller
Controller dispose!
argument: 0xffffffff9a0022c0
Segmentation fault: 11
显然 free() 调用失败是因为指针不正确。
我对此尝试了几种变体,例如,定义一个结构,例如:
class LEAP_CONTROLLER(Structure):
_fields_ = [
("data", c_void_p)
]
leap_controller = LEAP.leap_controller
leap_controller.res_type = POINTER(LEAP_CONTROLLER)
leap_controller_dispose = LEAP.leap_controller_dispose
leap_controller_dispose.argtype = [POINTER(LEAP_CONTROLLER)]
...但结果似乎总是一样的。
Python 读取指针,但只保留 32 位数据,并返回一个损坏的指针,其余位全为 1。
这两个二进制文件都是 64 位的:
Non-fat file: /usr/local/bin/python is architecture: x86_64
Non-fat file: ../../dll/libcleap.dylib is architecture: x86_64
我在这里看到了这个古老的问题:http: //bugs.python.org/issue1703286
...但它被标记为已解决。
其他一些随机邮寄此线程似乎提到 ctypes '将 64 位指针截断为 32 位',但人们似乎都神奇地解决了他们的问题而没有做任何事情('它现在可以工作')或没有得到他们的问题的答案.
有人知道我在做什么错吗?