这是我的问题,我有一个用C编写的遗留库(.so),API如下:
typedef void (*CALLBACK)( void);
typedef CALLBACK CALLBACK_TBL[ 5 ];
void init(CALLBACK_TBL callbackTbl)
{
T_MYCALLBACK *myCallback1 = (T_MYCALLBACK *)(callbackTbl[0]);
if (myCallback1 )
{
myCallback1(2,3);
}
}
当然,因为它是一个遗留库,所以我不能更改API签名
现在从Python开始,我尝试使用Python中定义的回调调用init:
CallbackType1 = ctypes.CFUNCTYPE(None, c_ulong, c_ulong)
CallbackType2 = ctypes.CFUNCTYPE(None, c_ubyte, c_ubyte)
...
CallbackType5 = ctypes.CFUNCTYPE(None, c_int32, c_int32)
def callback1(long1, long2):
print("callback1")
def callback2(bool1, bool2):
print("callback2")
...
def callback5(int1, int2):
print("callback5")
但我无法理解我应该如何进行这样一系列回调:
_callback1 = CallbackType1(callback1)
_callback2 = CallbackType1(callback2)
...
_callback5 = CallbackType1(callback5)
lib = CDLL("lib.so")
lib.init(....) ?????
有人有主意吗
清单[Python 3.Docs]: ctypes - A foreign function library for Python
最简单的方法是将C代码保持原样(不要过多考虑),并将其转换为Python:
其余的代码(我没有将其粘贴到控制台中,因为它不起作用):
始终为从.dll导入的函数定义argtypes(和restype)。查看[SO]: C function called from Python via ctypes returns incorrect value (@CristiFati's answer)了解更多详细信息
一个有效的例子就好了。我在下面创建了一个,但如果它不适合您,请使用与您的情况相匹配的类似DLL示例更新您的问题:
test.cpp
test.py
输出:
相关问题 更多 >
编程相关推荐