У меня есть 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), питон просто падает. Что я могу делать неправильно?
ли 'callback_type' переменный до сих пор в объеме, когда обратный вызов происходит? –
Да. Тип callback_ очень много. И некоторые из кажущихся очевидными ошибок, таких как прототип, несоответствие значения параметра/возвращаемого значения и т. Д., Были исключены. Мой коллега (работающий удаленно) пробовал одну и ту же DLL, используя обратный вызов C#, и он работает для него. Я не знаю C#, поэтому не знаю, имеет ли смысл сравнивать это с моим кодом на Python. – Kamalakshi
Это работает для меня. Я использовал VS2008 и вставил вызов в 'SetCallback'. Код, который вы опубликовали, не является полным, поскольку он никогда не вызывает обратный вызов, что заставляет меня задаться вопросом, что еще может быть. Можете ли вы воспроизвести проблему в минимальном, недавно созданном проекте C? –