Ответ 1
Для удобства использования ctypes - это путь.
Следующий пример ctypes - это фактический код, который я написал (в Python 2.5). Это, безусловно, самый простой способ найти то, что вы просите.
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call.
# HLLAPI
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int, # Return type.
ctypes.c_void_p, # Parameters 1 ...
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p) # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
# Actually map the call ("HLLAPI(...)") to a Python name.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
Материал ctypes
имеет все типы данных типа C (int
, char
, short
, void*
и т.д.) и может проходить по значению или ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (API HLL возвращает значения, изменяя переменную, переданную по ссылке).
В терминах конкретного примера, показанного выше, IBM EHLLAPI является довольно последовательным интерфейсом.
Все вызовы пропускают четыре указателя void (EHLLAPI отправляет код возврата обратно через четвертый параметр, указатель на int
, поэтому, в то время как я указываю int
как тип возвращаемого значения, я могу смело игнорировать его) в соответствии с IBM документация здесь. Другими словами, вариант C функции будет:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Это делает единственную простую функцию ctypes
, которая может делать все, что предоставляет библиотека EHLLAPI, но, вероятно, для других библиотек потребуется отдельная функция ctypes
, установленная для каждой библиотечной функции.
Возвращаемое значение из WINFUNCTYPE
является прототипом функции, но вам все равно нужно настроить дополнительную информацию о параметрах (сверх типов). Каждый кортеж в hllApiParams
имеет параметр "direction" (1 = input, 2 = output и т.д.), Имя параметра и значение по умолчанию - подробнее см. ctypes
doco
Как только у вас есть прототип и информация о параметрах, вы можете создать "вызываемый" Python hllApi
, с помощью которого можно вызвать функцию. Вы просто создаете необходимую переменную (p1
через p4
в моем случае) и вызываете функцию с ними.