Как исправить ошибку при подключении Dll python? Доброго времени суток, столкнулся со следующей проблемой: При вызове функции из dll, написанной на Си, pyton'ом получаю следующую ошибку: argument 1: : wrong type (код ниже)import ctypes from ctypes import * CanApiDll = cdll.vs_can_api 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_p 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 ctypesfrom ctypes import *
CanApiDll = cdll.vs_can_api
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 снова и убедиться, что ошибка больше не возникает.