2016-03-08 45 views
1

我想在用C++编写的DLL中注册一个用于回调的Python函数,我无法弄清楚如何去做。Cython:在DLL中注册一个用于回调的Python函数

我的C++代码头的样子:

extern "C" { 
    __declspec(dllexport) void RegisterFunc((void (*)()); 
} 

和实现是:

void (*funcCallback)() = NULL; 
__declspec(dllimport) void RegisterFunc(void(*func)()) 
{ 
    funcCallback = func; 
} 

我用Cython PYX文件看起来像:

cdef extern void RegisterFunc(void (*)()) 

def PyRegisterFunc(func): 
    RegisterFunc(func) 

当编译这给错误消息: 无法将Python对象转换为'void(*)(void)'

如果我改变代码:

def PyRegisterFunc(func): 
    RegisterFunc(<void (*)()>func) 

我得到的错误信息: Python对象不能转换为基本类型的指针

我也试过& FUNC并且得到错误消息:无法获取Python变量的地址。

将此Python函数作为指向我的C代码的正确方法是什么?

更新:我应该提到我的这个Python函数的预期目的。 Python应用程序使用PyQt编写,该函数将发出一个信号。 DLL本身没有Qt的知识,并且没有Qt库编译。 DLL中的一个方法会间接调用这个函数,它会向Python应用程序发出一个信号。

+0

我相信你的问题是,你的回调函数原型C不匹配的Python风格的函数原型(其中有一个的argc/argv的类似机构)。我从来没有使用过cython,我总是直接连接到python库。 – zmo

+0

如果你真的想将一个任意的python callable转换为一个c函数指针,那么你不能在Cython中完成它(但你可以使用ctypes/cffi)。如果你想使用一个特定的函数,那么在Cython中创建cdef/cpdef。 – DavidW

+0

文档[使用C库](http://docs.cython.org/src/tutorial/clibraries.html)有部分*回调*可能有用。 –

回答