Найти - Пользователи
Полная версия: Python 2.5 (win32) Вызов функции из библиотеки DLL
Начало » Python для новичков » Python 2.5 (win32) Вызов функции из библиотеки DLL
1
v3_62
Имеется DLL библиотека и следующее описание:

Для передачи информации на весы Тайгер-П используются две функции из динамической библиотеки TransferEth.dll, поставляемой вместе с программой управления весами SPCT. Одна из этих функций с вызовом ireturn=Transfer_Ethernet(“Transscale.ini”)
используется для загрузки PLU на весы из текстового файла , а другая с вызовом:
ireturn =Transfer_Ethernet_EX(“Transscale.ini”,251245664)

Пишу:

>>> from ctypes import cdll
>>> mydll = cdll.LoadLibrary('TransferEth.dll')

все нормально

начинаю вызывать функцию
>>>k=mydll.Transfer_Ethernet_EX(“Transscale.ini”,251245664)

пишит что функия Transfer_Ethernet_EX не найдена.

Что не так?
Как вызвать функцию из данной библиотеки?
Если конечно это работает.

Помогите добрым советом, хорошему человеку.
Всем заранее спасибо.
PooH
Для начала я бы посмотрел список функций в dll чем нибудь типа PE Explorer, tlibdump или что там еще есть под вин, чтобы убедится что в документации нет ошибки и функция называется именно так(имена регистрозависимы!).

Далее cdecl - это для функций с соглашением о вызове cdecl. возможно в этой библиотеке функции объявлены с stdcall, тогда надо пользовать windll.
v3_62
Воспользовался программой EnumFunc.exe,
для просмотра имен функций из библиотеки TransferEth.dll
это:

Transfer_Ethernet
_Transfer_Ethernet_EX@8

Имя второй функции неверное.

Первый вариант по протаколам загружает PLU в весы
но заканчивает работу с ошибкой.
Таким образом получить информацию из весов неудается.

Traceback (most recebt call last):
File “<stdin>”, line 1? in <module>
ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention

Как я понимаю нехватает четырехбайтового аргумента.
Надо искать нормальное описание для TransferEth.dll

Подскажите, есть ли еще варианты.
Андрей Светлов
http://www.mtrus.com/files/image/retail/tiger/tigerp_documents/protocoltigerp.pdf
PooH
Мне одному API драйвера этих весов видится жутким извращением?
v3_62
http://www.mtrus.com/files/image/retail … tigerp.pdf

Информацию брал как раз из данного документа.
Попробую пообщаться с предствителями МеттлерТоледо.
Андрей Светлов
Есть функция _Transfer_Ethernet_EX@8
Это - то что вам нужно. Имя правильное, это С++ так заматывает. Если не ошибаюсь, это cdecl на два параметра - как раз 8 байт просит. То, что вам нужно.
Просто так через dll._Transfer_Ethernet_EX@8 вы, конечно, ее не получите - имя нехорошее.
Зато getattr(dll, “_Transfer_Ethernet_EX@8”) должно работать.
Кажется, так. Попробовать сам не могу - ни винды ни весов нет.
v3_62
Зря в МеттлерТоледо написал.
Все решилось подключением dll через ctypes.windll

Всем большое спасибо.

Остается один вопрос, как можно было решить данную задачу
и найти информацию не используя интернет.
Как минимум часов восемь потратил, на решение такой простой задачи.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB