Zur Vereinfachung der Verwendung ist ctypes der richtige Weg.
Das folgende Beispiel für ctypes stammt aus dem von mir geschriebenen Code (in Python 2.5). Dies war bei weitem der einfachste Weg, den ich gefunden habe, um das zu tun, was Sie verlangen.
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))
Das ctypesMaterial verfügt über alle Typen - C-Datentypen ( int, char, short, void*, und so weiter) , und durch den Wert oder Bezug passieren kann. Es kann auch bestimmte Datentypen zurückgeben, obwohl mein Beispiel dies nicht tut (die HLL-API gibt Werte zurück, indem eine als Referenz übergebene Variable geändert wird).
In Bezug auf das oben gezeigte spezifische Beispiel ist die EHLLAPI von IBM eine ziemlich konsistente Schnittstelle.
Alle Aufrufe übergeben vier ungültige Zeiger (EHLLAPI sendet den Rückkehrcode über den vierten Parameter zurück, einen Zeiger auf einen intso, während ich intals Rückgabetyp spezifiziere , kann ich ihn sicher ignorieren) gemäß der Dokumentation von IBM hier . Mit anderen Worten wäre die C-Variante der Funktion:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Dies führt zu einer einzigen, einfachen ctypesFunktion, die alles kann, was die EHLLAPI-Bibliothek bietet. Es ist jedoch wahrscheinlich, dass andere Bibliotheken eine separate ctypesFunktion benötigen , die pro Bibliotheksfunktion eingerichtet wird.
Der Rückgabewert von WINFUNCTYPEist ein Funktionsprototyp, Sie müssen jedoch noch weitere Parameterinformationen einrichten (über die Typen hinaus). Jedes Tupel in hllApiParamshat einen Parameter "Richtung" (1 = Eingabe, 2 = Ausgabe usw.), einen Parameternamen und einen Standardwert - ctypesEinzelheiten finden Sie im Dokument
Sobald Sie die Prototyp- und Parameterinformationen haben, können Sie einen Python "aufrufbar" erstellen, hllApimit dem Sie die Funktion aufrufen können. Sie legen einfach die benötigte Variable ( p1durch p4in meinem Fall) und mit ihnen die Funktion aufrufen.