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 ctypesmaterial 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 intso, enquanto eu especifique intcomo 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 ctypesfunção única e simples capaz de fazer tudo o que a biblioteca EHLLAPI fornece, mas é provável que outras bibliotecas precisem de uma ctypesfunçã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 hllApiParamspossui 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 ctypesdocumento para obter detalhes
Depois de obter as informações de protótipo e parâmetro, você pode criar um Python "callable" hllApicom o qual chamar a função. Você simplesmente cria a variável necessária ( p1através p4do meu caso) e chama a função com eles.