У меня есть обратный вызов ctypes, который берет указатель на два двойных числа из dll и возвращает указатель на два двойных обратно в .dll.Первая часть работает правильно, но после многих испытаний и исследований я все еще не могу получить правильный указатель, чтобы вернуться к .dll после обратного вызова.
Вот код обратного вызова ctypes:
from scipy.integrate import dblquad
import ctypes
LibraryCB = ctypes.WINFUNCTYPE(ctypes.py_object, ctypes.POINTER(ctypes.c_double))
def LibraryCall(ptr):
n = ctypes.cast(ptr,ctypes.POINTER(ctypes.c_double))
x = n[0] #Value = 83.0
y = n[1] #Value = 30.0
area = dblquad(lambda x, y: x*y, 0, 0.5, lambda x: 0, lambda x: 1-2*x)
return_val = area[0], area[1]
return (return_val)
lib_call = LibraryCB(LibraryCall)
lib_call = ctypes.cast(lib_call,ctypes.POINTER(ctypes.c_longlong))
Я использовал ctypes.py_object в качестве типа указателя для возврата, поскольку все другие типы указателей возвращают ошибку, что это недопустимый тип указателя для обратного вызова,
Указатель возвращается в dll, но извлеченные значения не совпадают, что говорит о том, что у меня нет правильного типа указателя.
Я также попытался привести возвращаемое значение к указателю следующим образом: rv = ctypes.cast (return_val, ctypes.POINTER (ctypes.c_double)) и вернуть его вместо этого, но это не сработало.
Вот соответствующий код ctypes, который вызывает dll и обратный вызов:
CA_data1 = (ctypes.c_double * len(data1))(*data1)
CA_data2 = (ctypes.c_double * len(data2))(*data2)
hDLL = ctypes.WinDLL("C:/NASM_Test_Projects/SciPy_Test/SciPy_Test.dll")
CallName = hDLL.Main_Entry_fn
CallName.argtypes = [ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_longlong)]
CallName.restype = ctypes.c_double
ret_ptr = CallName(CA_data1,CA_data2,length_array_out,lib_call)
Большое спасибо за любые идеи о том, как решить эту проблему.