Форум сайта python.su
Имеется 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)
Офлайн
Для начала я бы посмотрел список функций в dll чем нибудь типа PE Explorer, tlibdump или что там еще есть под вин, чтобы убедится что в документации нет ошибки и функция называется именно так(имена регистрозависимы!).
Далее cdecl - это для функций с соглашением о вызове cdecl. возможно в этой библиотеке функции объявлены с stdcall, тогда надо пользовать windll.
Отредактировано (Фев. 10, 2010 09:36:20)
Офлайн
Воспользовался программой 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
Подскажите, есть ли еще варианты.
Офлайн
Офлайн
Мне одному API драйвера этих весов видится жутким извращением?
Офлайн
http://www.mtrus.com/files/image/retail … tigerp.pdf
Информацию брал как раз из данного документа.
Попробую пообщаться с предствителями МеттлерТоледо.
Отредактировано (Фев. 12, 2010 04:53:24)
Офлайн
Есть функция _Transfer_Ethernet_EX@8
Это - то что вам нужно. Имя правильное, это С++ так заматывает. Если не ошибаюсь, это cdecl на два параметра - как раз 8 байт просит. То, что вам нужно.
Просто так через dll._Transfer_Ethernet_EX@8 вы, конечно, ее не получите - имя нехорошее.
Зато getattr(dll, “_Transfer_Ethernet_EX@8”) должно работать.
Кажется, так. Попробовать сам не могу - ни винды ни весов нет.
Офлайн
Зря в МеттлерТоледо написал.
Все решилось подключением dll через ctypes.windll
Всем большое спасибо.
Остается один вопрос, как можно было решить данную задачу
и найти информацию не используя интернет.
Как минимум часов восемь потратил, на решение такой простой задачи.
Офлайн