У меня есть простая DLL с двумя функциями:
double __cdecl Multiply(double IN_A, double IN_B, double *OUT_C);
double __cdecl Sum(double IN_A, double IN_B);
Функциональный вызов DLL Sum
работает хорошо:
def sum_dll_test():
print("SUM")
dll_path = os.path.abspath("C:/MyDll_Project/OutputDll.dll")
print(dll_path)
myDll = ctypes.WinDLL(dll_path)
myDLLApiProto = ctypes.WINFUNCTYPE(
ctypes.c_double,
ctypes.c_double,
ctypes.c_double,
)
myDLLApiParams= (1, "IN_A", 0), (1, "IN_B", 0)
myApi = myDLLApiProto(("Sum", myDll), myDLLApiParams)
IN_A = ctypes.c_double(2)
IN_B = ctypes.c_double(3)
print(myApi(IN_A, IN_B))
Returns >5.0
Я не могу понять, как использовать мой Multiply
и передайте значение по ссылке , чтобы DLL изменила его.
def multiply_dll_test():
print("MULTIPLY")
dll_path = os.path.abspath("C:/MyDll_Project/OutputDll.dll")
print(dll_path)
myDll = ctypes.WinDLL(dll_path)
myDLLApiProto = ctypes.WINFUNCTYPE(
ctypes.c_double,
ctypes.c_double,
ctypes.c_double,
ctypes.c_void_p
)
myDLLApiParams= (1, "IN_A", 0), (1, "IN_B", 0), (1, "OUT_C", 0)
myApi = myDLLApiProto(("Multiply", myDll), myDLLApiParams)
IN_A = ctypes.c_double(3)
IN_B = ctypes.c_double(20)
OUT_C = ctypes.c_double
print(myApi(IN_A, IN_B, ctypes.byref(OUT_C)))
print(OUT_C)
>TypeError: byref() argument must be a ctypes instance, not '_ctypes.PyCSimpleType'
Я привел следующий пример, размещенный здесь: Как я могу использовать Файл DLL из Python? Также не понимают значения строки:
myDLLApiParams= (1, "IN_A", 0), (1, "IN_B", 0)