Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2015 16:43:17

Eleferen
Зарегистрирован: 2015-10-23
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

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

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

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

Функция 1 описана в документации, как:

function oziFindOzi:integer;stdcall;

и выводит “0”, если программа запущена и “-1”, если не запущена.

Соответственно код:
import ctypes
lib = ctypes.WinDLL("<путь до dll>\OziAPI.dll")
print(lib.oziFindOzi())

даст результат:
“0” или “-1”

Функция 2 должна возвращать текущую версию программы:
function oziGetOziVersion(var Version:pansichar;var DataLength:integer):integer;stdcall;

Соответственно:
import ctypes
lib = ctypes.WinDLL("<путь до dll>\OziAPI.dll")
print(lib.oziGetOziVersion())

Даст ошибку: OSError: exception: access violation writing 0xFFFFFFEB

Если вместо
print(lib.oziGetOziVersion())
использовать
print(lib.oziGetOziVersion)

, результат будет таким: <_FuncPtr object at 0x01DFE468>

Как всё-таки вернуть результат работы функции oziGetOziVersion?

Отредактировано Eleferen (Окт. 23, 2015 16:43:53)

Офлайн

#2 Окт. 23, 2015 17:09:54

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

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

Нужно создать буфер, передать его и его объём функции.
http://eli.thegreenplace.net/2008/08/31/ctypes-calling-cc-code-from-python
https://docs.python.org/3/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

Отредактировано Shaman (Окт. 23, 2015 17:17:19)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version