Para facilitar su uso, ctypes es el camino a seguir.
El siguiente ejemplo de ctypes es del código real que he escrito (en Python 2.5). Esta ha sido, con mucho, la forma más fácil que he encontrado para hacer lo que pides.
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))
El ctypes
material tiene todos los tipos de tipo C de datos ( int
, char
, short
, void*
, y así sucesivamente) y puede pasar por valor o referencia. También puede devolver tipos de datos específicos, aunque mi ejemplo no lo hace (la API HLL devuelve valores modificando una variable pasada por referencia).
En términos del ejemplo específico que se muestra arriba, EHLLAPI de IBM es una interfaz bastante consistente.
Todas las llamadas pasan cuatro punteros vacíos (EHLLAPI envía el código de retorno de regreso a través del cuarto parámetro, un puntero a un int
punto, mientras que especifico int
como tipo de retorno, puedo ignorarlo de manera segura) según la documentación de IBM aquí . En otras palabras, la variante C de la función sería:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Esto hace que una función única y simple ctypes
pueda hacer cualquier cosa que la biblioteca EHLLAPI proporcione, pero es probable que otras bibliotecas necesiten una ctypes
función separada configurada por función de biblioteca.
El valor de retorno de WINFUNCTYPE
es un prototipo de función, pero aún debe configurar más información de parámetros (además de los tipos). Cada tupla hllApiParams
tiene un parámetro "dirección" (1 = entrada, 2 = salida, etc.), un nombre de parámetro y un valor predeterminado; consulte el documento ctypes
para obtener más información.
Una vez que tenga la información del prototipo y los parámetros, puede crear un Python "invocable" hllApi
con el que llamar a la función. Sólo tiene que crear la variable sea necesario ( p1
a través p4
en mi caso) y llama a la función con ellos.