Per facilità d'uso, il tipo è la strada da percorrere.
Il seguente esempio di tipi è dal codice reale che ho scritto (in Python 2.5). Questo è stato di gran lunga il modo più semplice che ho trovato per fare ciò che chiedi.
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))
La ctypes
roba ha tutti i tipi del C-tipo di dati ( int
, char
, short
, void*
, e così via) e può passare per valore o riferimento. Può anche restituire tipi di dati specifici anche se il mio esempio non lo fa (l'API HLL restituisce valori modificando una variabile passata per riferimento).
In termini dell'esempio specifico mostrato sopra, EHLLAPI di IBM è un'interfaccia abbastanza coerente.
Tutte le chiamate passano quattro puntatori nulli (EHLLAPI restituisce il codice di ritorno attraverso il quarto parametro, un puntatore a un int
così, mentre specifico int
come tipo di ritorno, posso tranquillamente ignorarlo) secondo la documentazione di IBM qui . In altre parole, la variante C della funzione sarebbe:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Ciò rende possibile un'unica e semplice ctypes
funzione in grado di eseguire qualsiasi operazione fornita dalla libreria EHLLAPI, ma è probabile che altre librerie necessitino di una ctypes
funzione separata impostata per funzione di libreria.
Il valore restituito da WINFUNCTYPE
è un prototipo di funzione ma è comunque necessario impostare più informazioni sui parametri (oltre ai tipi). Ogni tupla in hllApiParams
ha un parametro "direction" (1 = input, 2 = output e così via), un nome parametro e un valore predefinito - vedi il ctypes
documento per i dettagli
Una volta che hai le informazioni sul prototipo e sui parametri, puoi creare un "callable" Python hllApi
con cui chiamare la funzione. Devi semplicemente creare la variabile necessaria ( p1
attraverso p4
nel mio caso) e chiamare la funzione con loro.