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 ctypes
Material 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 int
so, während ich int
als 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 ctypes
Funktion, die alles kann, was die EHLLAPI-Bibliothek bietet. Es ist jedoch wahrscheinlich, dass andere Bibliotheken eine separate ctypes
Funktion benötigen , die pro Bibliotheksfunktion eingerichtet wird.
Der Rückgabewert von WINFUNCTYPE
ist ein Funktionsprototyp, Sie müssen jedoch noch weitere Parameterinformationen einrichten (über die Typen hinaus). Jedes Tupel in hllApiParams
hat einen Parameter "Richtung" (1 = Eingabe, 2 = Ausgabe usw.), einen Parameternamen und einen Standardwert - ctypes
Einzelheiten finden Sie im Dokument
Sobald Sie die Prototyp- und Parameterinformationen haben, können Sie einen Python "aufrufbar" erstellen, hllApi
mit dem Sie die Funktion aufrufen können. Sie legen einfach die benötigte Variable ( p1
durch p4
in meinem Fall) und mit ihnen die Funktion aufrufen.