Как исправить ошибку при подключении 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
Гугление не очень помогло, поэтому буду очень признателен, если поможете
Заранее спасибо)

21 Авг 2019 в 06:32
193 +1
0
Ответы
1

Проблема возникает из-за неправильного определения параметров функции VSCanOpen. Метод byref не позволяет передавать строки напрямую, вам необходимо использовать метод create_string_buffer для создания буфера, который затем можно передать как параметр функции.

Попробуйте исправить ваш код следующим образом:

import ctype
from 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 снова и убедиться, что ошибка больше не возникает.

20 Апр в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 700 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир