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 ctypesroba 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 intcosì, mentre specifico intcome 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 ctypesfunzione in grado di eseguire qualsiasi operazione fornita dalla libreria EHLLAPI, ma è probabile che altre librerie necessitino di una ctypesfunzione 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 hllApiParamsha un parametro "direction" (1 = input, 2 = output e così via), un nome parametro e un valore predefinito - vedi il ctypesdocumento per i dettagli
Una volta che hai le informazioni sul prototipo e sui parametri, puoi creare un "callable" Python hllApicon cui chiamare la funzione. Devi semplicemente creare la variabile necessaria ( p1attraverso p4nel mio caso) e chiamare la funzione con loro.