Найти - Пользователи
Полная версия: Вызов функции из .dll с использованием ctypes
Начало » Python для новичков » Вызов функции из .dll с использованием ctypes
1
Eleferen
Доброго времени суток. Недавно начал изучать 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?
Shaman
Нужно создать буфер, передать его и его объём функции.
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB