¿Cómo puedo importar un winDLL en python y ser capaz de utilizar todas sus funciones? Sólo se necesita dobles y cadenas.

Lo que tienes hasta ahora, y cómo no funciona?
Duplicado con esta pregunta? stackoverflow.com/questions/252417/…

OriginalEl autor pajm | 2011-03-09

4 Comentarios

  1. 16

    Etiquetada la pregunta ctypes y suena como usted ya sabe la respuesta.

    La ctypes tutorial es excelente. Una vez que usted ha leído y entiende que usted será capaz de hacerlo con facilidad.

    Por ejemplo:

    >>> from ctypes import *
    >>> windll.kernel32.GetModuleHandleW(0)
    486539264

    Y un ejemplo de mi propio código:

    lib = ctypes.WinDLL('mylibrary.dll')
    #lib = ctypes.WinDLL('full/path/to/mylibrary.dll')
    func = lib['myFunc']#my func is double myFunc(double);
    func.restype = ctypes.c_double
    value = func(ctypes.c_double(42.0))
    Bueno, yo sabía que necesitaba ctypes, pero yo no sabía cómo usarlos. 🙂 También, muy buen enlace! La documentación de python parece sólo ser bueno para una referencia, pero no el aprendizaje real. Un millón de gracias!
    Espera! Creo que he pasado por alto el código. Después de ver el tutorial, parece que sólo demuestran cómo cargar archivos Dll de windows. Necesito cargar un archivo DLL personalizado de archivo. ¿Cómo puedo hacer esto?
    He añadido otro ejemplo. Pero es todo lo que hay en el tutorial. No hay ningún teórico de la diferencia entre llamar a su propio DLL y un archivo DLL de Windows.
    Yo odio que te moleste de nuevo… Pero podría usted comprobar el código que puse en la pregunta original? Gracias!
    Por favor, podrías simplemente hacer una nueva pregunta. Incluir el código, tanto en el ctypes código y la función de DLL de la firma.

    OriginalEl autor David Heffernan

  2. 3

    Voy a postear mi experiencia. Primero de todo, a pesar de todo el trabajo duro que me llevan a poner todas las piezas juntas, la importación de un C# dll es fácil. La manera en que lo hice es:

    1) Instalar este paquete de nuget (no soy el dueño, es muy útil) con el fin de construir una dll no administrada: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

    2) el C# dll de código como este:

    using System;
    using RGiesecke.DllExport;
    using System.Runtime.InteropServices;
    
    public class MyClassName
    {
       [DllExport("MyFunctionName",CallingConvention = CallingConvention.Cdecl)]
       [return: MarshalAs(UnmanagedType.LPWStr)]
       public static string MyFunctionName([MarshalAs(UnmanagedType.LPWStr)] string iString)
       {
           return "hello world i'm " + iString
       }
    }

    3) el código de python es como este:

    import ctypes
    #Here you load the dll into python 
    MyDllObject = ctypes.cdll.LoadLibrary("C:\My\Path\To\MyDLL.dll")
    #it's important to assing the function to an object
    MyFunctionObject = MyDllObject.MyFunctionName
    #define the types that your C# function return
    MyFunctionObject.restype = ctypes.c_wchar_p
    #define the types that your C# function will use as arguments
    MyFunctionObject.argtypes = [ctypes.c_wchar_p]
    #That's it now you can test it
    print(MyFunctionObject("Python Message"))

    OriginalEl autor piloks_aiti

  3. 2

    Uso Cython, tanto para acceder a los archivos Dll, y para generar enlaces Python para ellos.

    OriginalEl autor Apalala

  4. 1

    c-tipos de NOTA!

    Utilizando WinDLL (y wintypes, msvcrt) es windows importaciones específicas y no siempre funciona, incluso en las ventanas! La razón es que depende de tu instalación de python. Es nativo de Windows (o usando Cygwin o servicio de ENVÍO de mensajes)?

    Para ctypes, el más portátil y la forma correcta es utilizar cdll como este:

    import sys
    import ctypes
    from ctypes import cdll, c_ulong
    
    kFile = 'C:\Windows\System32\kernel32.dll'
    mFile = 'C:\Windows\System32\msvcrt.dll'
    
    try: 
        k32    = cdll.LoadLibrary(kFile)
        msvcrt = cdll.LoadLibrary(mFile)
    except OSError as e:
        print("ERROR: %s" % e)
        sys.exit(1)
    
    # do something...

    OriginalEl autor not2qubit

Dejar respuesta

Please enter your comment!
Please enter your name here