我使用ctypes将MyDll中的c函数扩展为python。
from ctypes import cdll
libX = cdll.LoadLibrary("d:\\MyTestProject\\debug\\MyDll.dll")
进一步在.py文件中我有一个类,其方法通过ctypes调用MyDll中的函数。
Class MyTestClass:
def __init__(self,id):
libA.MyTestClassInDLL_new.restype = ctypes.c_void_p
self.obj = libA.MyTestClassInDLL_new(id)
相应的c函数MyTestClassInDLL_new已在MyDll中定义为 -
extern "C" __declspec(dllexport) void * MyTestClassInDLL_new(char* id)
{
pTestObject = new CMyTestClassInDLL(CString(id));
return (void *)pTestObject;
}
注意我使用new在我的vc ++ dll中实例化这个对象并返回指向它的指针。我在.py文件中将此函数的resttype设置为ctypes.c_void_p。
我执行的脚本包含以下内容 -
testob = MyTestClass("5")
这很好用。我在这里获得的testob进一步用于调用其内部调用MyDll中的c函数的方法。
然而,该对象是在MyDll中使用new创建的,并通过MyTestClassInDLL_new()函数返回。这个物体是如何被摧毁的?在某个地方我需要使用delete pTestObject,以便调用它的析构函数来执行清理并释放内存。
答案 0 :(得分:4)
我通常通过添加一个extern destroy对象函数来处理这个问题,我可以将指针传回并删除它。
CPP:
SomeClass* createObj()
{
return new SomeClass();
}
void destroyObj(SomeClass* pObj){
delete pObj;
pObj = NULL;
}
H:
extern "C" {
SomeClass* createObj();
void destroyObj(SomeClass*);
}
PY:
class SomeObj:
def __init__(self):
self.soLib = cdll.LoadLibrary(PATH_SO)
_createObj = self.soLib.createObj
_createObj.restype = POINTER(c_long)
self._objRef = _createObj()
## do stuff with self._objRef
def __del__(self):
self.soLib.destroyObj(self._objRef)