2014-01-09 42 views
1

我有一个Visual C++ DLL。我有一个SetCallback(函数指针)在DLL中导出。 我使用此函数从python2.7脚本设置回调函数。我遵循Python文档中给出的内容。C DLL到Python回调

from ctypes import * 
def mypy_callback(number): 
    print str(number) 

d = cdll.LoadLibrary(r"myfunctions.dll") 
callback_type = CFUNCTYPE(None, c_int) 
d.SetCallback(callback_type(mypy_callback)) 

在C代码中,我有

typedef void (*callback_function)(int); 
void SetCallback(callback_function aCallback) 
{ 
    py_callback = aCallback; 
} 

当我打电话从C DLL这个功能,像这样:py_callback(999),蟒蛇只是崩溃。 我能做什么错?

+0

是'callback_type'变量仍范围回调时会发生什么? –

+0

是的。 callback_type的范围非常广泛。一些看似明显的错误,如原型,参数/返回值不匹配等已被排除。我的同事(远程工作)使用C#回调尝试了相同的DLL,并且适用于他。我不知道C#,所以不知道将它与我的Python代码进行比较是否有意义。 – Kamalakshi

+0

它适合我。我使用VS2008,并将调用插入到'SetCallback'中。你发布的代码并不完整,因为它从来不会调用回调函数,这让我想知道还有什么可能。您是否能够在最小的,新创建的C项目中重现该问题? –

回答

2

下面的回调间接将解决这个问题:

d = cdll.LoadLibrary(r"myfunctions.dll") 
callback_type = CFUNCTYPE(None, c_int) 
callback = callback_type(mypy_callback) 
d.SetCallback(callback) 
+0

非常感谢,但可以请解释为什么必须有回调变量?问题与其范围有什么关系? – Odysseus

+0

好吧,ctypes文档中的这个注释说明了:“确保你保持CFUNCTYPE()对象的引用,只要它们是从C代码使用的.ctypes不会,如果你不这样做,它们可能被垃圾收集,崩溃你的程序在进行回调时。“ – Odysseus