Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Eleferen
0 / 0 / 0
Регистрация: 23.10.2015
Сообщений: 3
#1

Вызов функции из .dll с использованием ctypes

23.10.2015, 13:21. Просмотров 1509. Ответов 3
Метки нет (Все метки)

Доброго времени суток. Недавно начал изучать python и мой вопрос, наверное, покажется сильно нубским, но тем не менее...

Есть UserApi некой программы. Функции доступа к Api реализованы при помощи библиотеки dll.

Функция 1 описана в документации, как:
C++
1
function oziFindOzi:integer;stdcall;
и выводит "0", если программа запущена и "-1", если не запущена.

Соответственно код:
Python
1
2
3
import ctypes
lib = ctypes.WinDLL("<путь до dll>\OziAPI.dll")
print(lib.oziFindOzi())
даст результат:

"0" или "-1"

Функция 2:
C++
1
function oziGetOziVersion(var Version:pansichar;var DataLength:integer):integer;stdcall;
Соответственно:
Python
1
2
3
import ctypes
lib = ctypes.WinDLL("<путь до dll>\OziAPI.dll")
print(lib.oziGetOziVersion())
Даст ошибку: OSError: exception: access violation writing 0xFFFFFFEB

Если вместо
Python
1
print(lib.oziGetOziVersion())
использовать
Python
1
print(lib.oziGetOziVersion)
, результат будет таким: <_FuncPtr object at 0x01DFE468>

Как всё-таки вернуть результат работы функции oziGetOziVersion?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2015, 13:21
Ответы с готовыми решениями:

Вызов функции из Dll
Помогите пожалуйста решить проблему. Вот код вызывает функцию из под vb.net....

Вызов функции из dll написанной на delphi из python
Импортировал ctypes, подключился к dll. Есть например такая функция: ...

Ctypes.string_at
Требуется извлечь данные из заранее известной ячейки памяти. В ячейке находятся...

Python + ctypes
Не знаю куда писать, но наверное это ближе к Python. Есть простой тестовый...

Ctypes, list, dict
Есть список, каждый элемент списка - словарь из 4 пар. Необходимо сделать...

3
dondublon
2136 / 1054 / 212
Регистрация: 17.03.2012
Сообщений: 6,389
Записей в блоге: 5
26.10.2015, 07:42 #2
Либа на delphi чтоле?
В oziGetOziVersion вроде как параметры передавать надо.
0
Eleferen
0 / 0 / 0
Регистрация: 23.10.2015
Сообщений: 3
26.10.2015, 08:34  [ТС] #3
Да вот непонятно, передавать ли, в описании-то функции oziGetOziVersion написано: "The version of OziExplorer is returned in the Version variable."
На чём написана библиотека - в документации не сказано (
0
dondublon
2136 / 1054 / 212
Регистрация: 17.03.2012
Сообщений: 6,389
Записей в блоге: 5
26.10.2015, 08:57 #4
На чём написана библиотека - видно из приведённого вами кода. Синтаксис, характерный для delphi.
А "передавать ли" - понятно. Во-первых, в коде (сигнатуре) указано, во-вторых, в документации.
Передаётся var Versionansichar, то есть указатель на строку, и там, в соответствии с документацией, и будет записана версия.
Как именно передавать - не в курсе, таким не занимался, но вы-то вообще никак не передаёте. Неудивительно, что получается access violation.

Добавлено через 1 минуту
Можно предположить, что во втором параметре - DataLength - надо передавать длину этой строки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2015, 08:57

Вызов из Python функций сторонней DLL
Подскажите пожалуйста по такому вопросу. Нужно из Python вызвать функцию из...

[Linux] ctypes.CDLL не находит .so в текущем каталоге
Как загрузить .so библиотеку из текущего каталога? Нормально грузит только с...

Вызов функции
Господа, не ругайте... почему def add(x, y): return x + y ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru