访问ctypes返回对象的方法

时间:2013-10-28 13:33:47

标签: python ctypes

我需要将c ++ dll包装到python中。我正在使用ctypes模块。

c ++标题类似于:

class NativeObj
{
    void func();
}

extern "C"
{
    NativeObj* createNativeObj(); 

}; //extern "C"

我想在python代码中创建NativeObj,然后调用它的func方法。

我编写了这段代码,并获得指向NativeObj的指针,但我找不到如何访问func

>>> import ctypes
>>> d = ctypes.cdll.LoadLibrary('dll/path')
>>> obj = d.createNativeObj()
>>> obj
36408838
>>> type(obj)
<type 'int'>

感谢。

1 个答案:

答案 0 :(得分:5)

您无法从ctypes调用C ++实例方法。您将需要导出将调用该方法的非成员函数。它在C ++中看起来像这样:

void callFunc(NativeObj* obj)
{
    obj->func();
}

然后你可以这样称呼它:

import ctypes
d = ctypes.cdll.LoadLibrary('dll/path')
obj = d.createNativeObj()
d.callFunc(obj)

告诉ctypes涉及的类型也很有用。

import ctypes
d = ctypes.cdll.LoadLibrary('dll/path')

createNativeObj = d.createNativeObj
createNativeObj.restype = ctypes.c_void_p
callFunc = d.callFunc
callFunc.argtypes = [ctypes.c_void_p]

obj = createNativeObj()
callFunc(obj)