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))
ctypesMateriał 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 inttak, podczas gdy określam intjako 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 ctypesfunkcja jest w stanie zrobić wszystko, co zapewnia biblioteka EHLLAPI, ale prawdopodobne jest, że inne biblioteki będą wymagały osobnej ctypeskonfiguracji dla każdej funkcji biblioteki.
Zwracana wartość z WINFUNCTYPEjest prototypem funkcji, ale nadal musisz skonfigurować więcej informacji o parametrach (ponad typami). Każda krotka hllApiParamsma parametr „kierunek” (1 = wejście, 2 = wyjście itd.), Nazwę parametru i wartość domyślną - ctypesszczegółowe informacje można znaleźć w dokumentacji doco
Po uzyskaniu informacji o prototypie i parametrach można utworzyć „wywoływalny” język Python, za hllApipomocą którego można wywołać funkcję. Wystarczy stworzyć niezbędną zmienną ( p1poprzez p4w moim przypadku) i wywołać funkcję z nimi.