Для зручності використання 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
Матеріал має всі типи С-типу даних ( int
, char
, short
, void*
, і т.д.) і може передавати за значенням або посиланням. Він також може повертати конкретні типи даних, хоча мій приклад цього не робить (API HLL повертає значення, змінюючи змінну, передану посиланням).
З точки зору конкретного прикладу, показаного вище, EHLLAPI IBM є досить послідовним інтерфейсом.
Усі виклики передають чотири недійсні покажчики (EHLLAPI посилає повертаючий код назад через четвертий параметр, вказівник на int
так, в той час як я вказуюint
як тип повернення, я можу сміливо ігнорувати його) згідно документації IBM тут . Іншими словами, варіантом функції C буде:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Це створює єдину просту ctypes
функцію, здатну виконувати все, що надається бібліотеці EHLLAPI, але ймовірно, що для інших бібліотек знадобиться окрема ctypes
функція, налаштована на кожну функцію бібліотеки.
Повернене значення від WINFUNCTYPE
- це прототип функції, але вам все одно доведеться встановити більше інформації про параметри (вище і вище типів). Кожен кортеж hllApiParams
має параметр "напрям" (1 = вхід, 2 = вихід тощо), ім'я параметра та значення за замовчуванням - ctypes
детальну інформацію див. У документі
Коли ви отримаєте інформацію про прототип і параметри, ви можете створити Python "calllable", за hllApi
допомогою якого можна викликати функцію. Ви просто створити необхідну змінну ( p1
через p4
в моєму випадку) і викличте функцію з ними.