Форум программистов, компьютерный форум, киберфорум
Наши страницы

Python

Войти
Регистрация
Восстановить пароль
 
Eleferen
0 / 0 / 0
Регистрация: 23.10.2015
Сообщений: 3
#1

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

23.10.2015, 13:21. Просмотров 1352. Ответов 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 с использованием ctypes (Python):

Вызов функции из Dll - Python
Помогите пожалуйста решить проблему. Вот код вызывает функцию из под vb.net. Private Declare Function goup Lib &quot;my.dll&quot; (ByVal a As...

Python + ctypes - Python
Не знаю куда писать, но наверное это ближе к Python. Есть простой тестовый пример. A.hpp #ifndef A_HPP_ #define A_HPP_ ...

Ctypes.string_at - Python
Требуется извлечь данные из заранее известной ячейки памяти. В ячейке находятся 3 числа float и &quot;Cheat Engine&quot; показывает их в виде...

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

[Linux] ctypes.CDLL не находит .so в текущем каталоге - Python
Как загрузить .so библиотеку из текущего каталога? Нормально грузит только с /usr/local/lib . Пробовал записывать путь в LD_LIBRARY_PATH,...

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

3
dondublon
1323 / 1019 / 123
Регистрация: 17.03.2012
Сообщений: 6,240
Записей в блоге: 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
1323 / 1019 / 123
Регистрация: 17.03.2012
Сообщений: 6,240
Записей в блоге: 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. Dll не определена в коде и подключается программно - Visual Basic .NET
Я написал простую функцию которая возвращает негатив bitmap'а Function Negative(ByVal Bmp As Bitmap) Dim Bmp2 As New...

Inject dll, а также вызов функции из этой же dll - Delphi WinAPI
Всем привет, заинжектить dll в другой процесс получилось, но еще необходимо вызвать функцию в этой длл, каким образом это реализовать? ...

Вызов функции DLL VB.NET в DLL C++ - C++ Builder
Как вызывать функции dll VB.NET через dll С++, которая приинжекчена к процессу проводника?


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

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

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