2014-01-09 43 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