-
通过工厂方法创建一个类。
传入参数第一个是返回参数,后面所有都是传入参数类型。
-
两个工厂方法
CFUNCTYPE()
cdecl的形式调用方法。WINFUNCTYPE()
stdcall的方式调用方法。 -
通过工厂方法建造出来的类来转义
python
定义的方法。from ctypes import * ret = CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int)) def cmp(a,b): return a[0]-b[0] cmp_func = ret(cmp) arrays = (c_int*6)(2,3,2,78,12,53) cdll.msvcrt.qsort(byref(arrays),len(arrays),sizeof(c_int),cmp_func) for i in range(6): print(arrays[i])
-
回调函数生命周期
如果发现回调函数没有被引用,那么就可能会被垃圾回收期回收。
如果方法在
Python
可控范围外调用,也就是说在其他代码中调用,如这里的qsort
回调,就是在C中调用。ctypes将会为每一次调用创建一个新的仿真线程。大多数情况下没有问题,但是调用过程中,在threading.local
中存储的数据无法避免的被释放,即使在同一个C线程中。 -
装饰器的方式调用
from ctypes import * @CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int)) def cmp(a,b): return a[0]-b[0] arrays = (c_int*6)(2,3,2,78,12,53) cdll.msvcrt.qsort(byref(arrays),len(arrays),sizeof(c_int),cmp) for i in range(6): print(arrays[i])
来源:https://my.oschina.net/u/3695598/blog/3133501