Как исправить ошибку при подключении 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
219 +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 Апр 2024 в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир