Передача ByRef в функцию DLL в Python - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть простая 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...