Dla ułatwienia użytkowania ctypes jest właściwą drogą.
Poniższy przykład ctypów pochodzi z faktycznego kodu, który napisałem (w Pythonie 2.5). To zdecydowanie najłatwiejszy sposób, w jaki znalazłem robienie tego, o co prosisz.
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
Materiał posiada typach danych typu C ( int
, char
, short
, void*
, i tak dalej), może przechodzić przez wartość lub odniesienia. Może także zwracać określone typy danych, chociaż mój przykład tego nie robi (interfejs API HLL zwraca wartości poprzez modyfikację zmiennej przekazywanej przez referencję).
Jeśli chodzi o konkretny przykład pokazany powyżej, interfejs EHLLAPI firmy IBM jest dość spójnym interfejsem.
Wszystkie wywołania przekazują cztery puste wskaźniki (EHLLAPI wysyła kod powrotu z powrotem przez czwarty parametr, wskaźnik do int
tak, podczas gdy określam int
jako typ zwracany, mogę go bezpiecznie zignorować) zgodnie z dokumentacją IBM tutaj . Innymi słowy, wariantem C funkcji byłoby:
int hllApi (void *p1, void *p2, void *p3, void *p4)
To sprawia, że jedna, prosta ctypes
funkcja jest w stanie zrobić wszystko, co zapewnia biblioteka EHLLAPI, ale prawdopodobne jest, że inne biblioteki będą wymagały osobnej ctypes
konfiguracji dla każdej funkcji biblioteki.
Zwracana wartość z WINFUNCTYPE
jest prototypem funkcji, ale nadal musisz skonfigurować więcej informacji o parametrach (ponad typami). Każda krotka hllApiParams
ma parametr „kierunek” (1 = wejście, 2 = wyjście itd.), Nazwę parametru i wartość domyślną - ctypes
szczegółowe informacje można znaleźć w dokumentacji doco
Po uzyskaniu informacji o prototypie i parametrach można utworzyć „wywoływalny” język Python, za hllApi
pomocą którego można wywołać funkcję. Wystarczy stworzyć niezbędną zmienną ( p1
poprzez p4
w moim przypadku) i wywołać funkcję z nimi.