Python ctypes对SWIG的回调函数

Kni*_*nio 5 c++ python swig ctypes

我有一个SWIG C++函数,需要一个函数指针(WNDPROC),并希望给它一个由ctypes.WINFUNCTYPE包装的Python函数.

在我看来,这应该兼容,但SWIG的类型检查会引发异常,因为它不知道ctypes.WINFUNCTYPE类型实际上是WNDPROC.

我可以做些什么来将我的回调传递给SWIG,以便它理解它?

Chr*_*ris 4

我没有 Windows 机器来真正检查这一点,但我认为您需要创建一个类型映射来告诉 swig 如何将 PyObject 包装器转换为 WNDPROC:

// assuming the wrapped object has an attribute "pointer" which contains 
// the numerical address of the WNDPROC
%typemap(in) WNDPROC {
    PyObject * addrobj = PyObject_GetAttrString($input, "pointer");
    void * ptr = PyLong_AsVoidPt(addrobj);
    $1 = (WNDPROC)ptr;
}
Run Code Online (Sandbox Code Playgroud)