Para facilitar o uso, ctypes é o caminho a percorrer.
O exemplo a seguir de ctypes é do código real que eu escrevi (no Python 2.5). Essa foi, de longe, a maneira mais fácil que encontrei para fazer o que você pede.
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))
O ctypes
material tem a todos os tipos de dados do tipo C ( int
, char
, short
, void*
, e assim por diante) e pode passar por ou valor de referência. Ele também pode retornar tipos de dados específicos, embora meu exemplo não faça isso (a API da HLL retorna valores modificando uma variável passada por referência).
Em termos do exemplo específico mostrado acima, o EHLLAPI da IBM é uma interface bastante consistente.
Todas as chamadas passam por quatro ponteiros nulos (o EHLLAPI envia o código de retorno de volta pelo quarto parâmetro, um ponteiro para um int
so, enquanto eu especifique int
como o tipo de retorno, posso ignorá-lo com segurança) conforme a documentação da IBM aqui . Em outras palavras, a variante C da função seria:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Isso cria uma ctypes
função única e simples capaz de fazer tudo o que a biblioteca EHLLAPI fornece, mas é provável que outras bibliotecas precisem de uma ctypes
função separada configurada por função da biblioteca.
O valor de retorno de WINFUNCTYPE
é um protótipo de função, mas você ainda precisa configurar mais informações de parâmetro (acima e acima dos tipos). Cada tupla hllApiParams
possui um parâmetro "direção" (1 = entrada, 2 = saída e assim por diante), um nome de parâmetro e um valor padrão - consulte o ctypes
documento para obter detalhes
Depois de obter as informações de protótipo e parâmetro, você pode criar um Python "callable" hllApi
com o qual chamar a função. Você simplesmente cria a variável necessária ( p1
através p4
do meu caso) e chama a função com eles.