Как исправить ошибку при подключении Dll python? Доброго времени суток, столкнулся со следующей проблемой: При вызове функции из dll, написанной на Си, pyton'ом получаю следующую ошибку: argument 1: : wrong type (код ниже)import ctype from ctypes import CanApiDll = cdll.vs_can_ap handle = "12345 U_Handle = handle.encode('utf-8' DevHandle = c_char_p(U_Handle Mode = c_ulong(0 PrototypeOpen = WINFUNCTYPE(c_int, c_char_p, c_ulong) # c_char_p -> c_wchar_ VSCanOpenParam = (1, "DevHandle", 0), (1, "Mode", 0 VSCanOpen = PrototypeOpen(("VSCAN_Open", CanApiDll), VSCanOpenParam VSCanOpen(ctypes.byref(DevHandle), Mode Сначала думал, что ошибка кроется в вызове c_char_p и решил попробовать функцию, принимающую только c_int:N = c_int(1 PrototypeClose = WINFUNCTYPE(c_int, c_int VSCanCloseParam = (1, "DevHandle", 0) VSCanClose = PrototypeClose(("VSCAN_Close" , CanApiDll), VSCanCloseParam VSCanClose(N Но появляется уже другая ошибка, которая выглядит так: Procedure probably called with too many arguments (4 bytes in excess Гугление не очень помогло, поэтому буду очень признателен, если поможете Заранее спасибо)
Проблема возникает из-за неправильного определения параметров функции VSCanOpen. Метод byref не позволяет передавать строки напрямую, вам необходимо использовать метод create_string_buffer для создания буфера, который затем можно передать как параметр функции.
Проблема возникает из-за неправильного определения параметров функции VSCanOpen. Метод byref не позволяет передавать строки напрямую, вам необходимо использовать метод create_string_buffer для создания буфера, который затем можно передать как параметр функции.
Попробуйте исправить ваш код следующим образом:
import ctypefrom ctypes import
CanApiDll = cdll.vs_can_ap
handle = "12345
U_Handle = handle.encode('utf-8'
Mode = c_ulong(0
PrototypeOpen = WINFUNCTYPE(c_int, c_char_p, c_ulong
VSCanOpenParam = (1, "DevHandle", None), (1, "Mode", None
VSCanOpen = PrototypeOpen(("VSCAN_Open", CanApiDll), VSCanOpenParam
# Создание буфера для передачи строк
DevHandle = ctypes.create_string_buffer(U_Handle
VSCanOpen(DevHandle, Mode)
Также, убедитесь, что правильно определен тип функции WINFUNCTYPE с учетом возвращаемого типа и типов параметров.
После внесения этих изменений, следует попробовать вызвать функцию VSCanOpen снова и убедиться, что ошибка больше не возникает.