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

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

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

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

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

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