2014-01-09 2 views
1

У меня есть Visual C++ DLL. У меня есть SetCallback (функция-указатель), экспортированный в DLL. Я использую эту функцию для установки функции обратного вызова из сценария python2.7. Я следую тому, что дано в документации Python.C DLL to Python Callback

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_ очень много. И некоторые из кажущихся очевидными ошибок, таких как прототип, несоответствие значения параметра/возвращаемого значения и т. Д., Были исключены. Мой коллега (работающий удаленно) пробовал одну и ту же DLL, используя обратный вызов C#, и он работает для него. Я не знаю 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