<p>一个有效的例子就好了。我在下面创建了一个,但如果它不适合您,请使用与您的情况相匹配的类似DLL示例更新您的问题:</p>
<p>test.cpp</p>
<pre><code>typedef void (*CALLBACK)(); // generic
typedef void (*CALLBACK1)(long,long);
typedef void (*CALLBACK2)(bool,bool);
typedef void (*CALLBACK3)(int,int,int);
typedef CALLBACK CALLBACK_TBL[3];
extern "C" __declspec(dllexport)
void init(CALLBACK_TBL callbackTbl)
{
((CALLBACK1)callbackTbl[0])(1L,2L);
((CALLBACK2)callbackTbl[1])(true,false);
((CALLBACK3)callbackTbl[2])(1,2,3);
}
</code></pre>
<p>test.py</p>
<pre><code>from ctypes import *
CALLBACK1 = CFUNCTYPE(None,c_long,c_long)
CALLBACK2 = CFUNCTYPE(None,c_bool,c_bool)
CALLBACK3 = CFUNCTYPE(None,c_int,c_int,c_int)
class CALLBACK_TBL(Structure):
_fields_ = [('cb1',CALLBACK1),
('cb2',CALLBACK2),
('cb3',CALLBACK3)]
@CALLBACK1
def callback1(a,b):
print('callback1',a,b)
@CALLBACK2
def callback2(a,b):
print('callback2',a,b)
@CALLBACK3
def callback3(a,b,c):
print('callback3',a,b,c)
cbt = CALLBACK_TBL(callback1,callback2,callback3)
dll = CDLL('./test')
dll.init.argtypes = CALLBACK_TBL,
dll.init.restype = None
dll.init(cbt)
</code></pre>
<p>输出:</p>
<pre><code>callback1 1 2
callback2 True False
callback3 1 2 3
</code></pre>