python27 dll error




¿Cómo puedo usar un archivo DLL de Python? (4)

¿Cuál es la forma más fácil de usar un archivo DLL desde Python?

Específicamente, ¿cómo se puede hacer esto sin escribir ningún código C ++ envoltorio adicional para exponer la funcionalidad a Python?

La funcionalidad nativa de Python es muy preferible a usar una biblioteca de terceros.


Para facilidad de 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, de lejos, la forma más fácil que he encontrado para hacer lo que me 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 elemento ctypes tiene todos los tipos de datos tipo C ( int , char , short , void* , etc.) 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 mediante la modificación de 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 a través del cuarto parámetro, un puntero a un int así que, mientras especifico int como el tipo de retorno, puedo ignorarlo con seguridad) según la documentación de IBM here . 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 simple y simple de ctypes capaz de hacer cualquier cosa que proporcione la biblioteca EHLLAPI, pero es probable que otras bibliotecas necesiten una función ctypes separada configurada por función de biblioteca.

El valor de retorno de WINFUNCTYPE es un prototipo de función, pero aún tiene que configurar más información de parámetros (más allá de los tipos). Cada tupla en hllApiParams tiene un parámetro "dirección" (1 = entrada, 2 = salida, etc.), un nombre de parámetro y un valor predeterminado - vea los ctypes doco para detalles

Una vez que tenga la información del prototipo y el parámetro, puede crear un hllApi "invocable" de hllApi con el que invocar la función. Simplemente crea la variable necesaria ( p1 a p4 en mi caso) y llama a la función con ellos.


Tal vez con Dispatch :

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

Donde zkemkeeper es un archivo DLL registrado en el sistema ... Después de eso, puede acceder a las funciones con solo llamarlas:

zk.Connect_Net(IP_address, port)

ctypes será lo más fácil de usar pero (mal) usarlo hace que Python esté sujeto a bloquearse. Si tratas de hacer algo rápidamente y eres cuidadoso, es genial.

Te animo a que revises Boost Python . Sí, requiere que escriba algún código C ++ y tenga un compilador C ++, pero en realidad no necesita aprender C ++ para usarlo, y puede obtener un compilador C ++ gratuito (como en la cerveza) de Microsoft .


Esta página es un ejemplo muy simple de funciones de llamada desde un archivo DLL.

Es muy fácil llamar a una función DLL en Python. Tengo un archivo DLL hecho a sí mismo con dos funciones: add y sub que toman dos argumentos.

add(a, b) devuelve la adición de dos números
sub(a, b) devuelve la resta de dos números

El nombre del archivo DLL será "demo.dll"

Programa:

from ctypes import*
# give location of dll
mydll = cdll.LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:-"+result1
print "Substraction:-"+result2

Salida:

Addition value:-11
Substraction:-9





dll