Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 10, 2010 07:33:30

v3_62
От:
Зарегистрирован: 2010-02-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.5 (win32) Вызов функции из библиотеки DLL

Имеется 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 не найдена.

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

Помогите добрым советом, хорошему человеку.
Всем заранее спасибо.



Отредактировано (Фев. 10, 2010 09:43:55)

Офлайн

#2 Фев. 10, 2010 09:35:01

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Python 2.5 (win32) Вызов функции из библиотеки DLL

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

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Фев. 10, 2010 09:36:20)

Офлайн

#3 Фев. 11, 2010 04:48:38

v3_62
От:
Зарегистрирован: 2010-02-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.5 (win32) Вызов функции из библиотеки DLL

Воспользовался программой 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

Подскажите, есть ли еще варианты.



Офлайн

#4 Фев. 11, 2010 16:25:11

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Python 2.5 (win32) Вызов функции из библиотеки DLL

Офлайн

#5 Фев. 11, 2010 19:20:45

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Python 2.5 (win32) Вызов функции из библиотеки DLL

Мне одному API драйвера этих весов видится жутким извращением?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Фев. 12, 2010 03:53:14

v3_62
От:
Зарегистрирован: 2010-02-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.5 (win32) Вызов функции из библиотеки DLL

http://www.mtrus.com/files/image/retail … tigerp.pdf

Информацию брал как раз из данного документа.
Попробую пообщаться с предствителями МеттлерТоледо.



Отредактировано (Фев. 12, 2010 04:53:24)

Офлайн

#7 Фев. 12, 2010 04:08:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Python 2.5 (win32) Вызов функции из библиотеки DLL

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



Офлайн

#8 Фев. 12, 2010 05:38:24

v3_62
От:
Зарегистрирован: 2010-02-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 2.5 (win32) Вызов функции из библиотеки DLL

Зря в МеттлерТоледо написал.
Все решилось подключением dll через ctypes.windll

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

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version