IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

[WINDOWS] accès dll


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut [WINDOWS] accès dll
    Salut,

    Je suis confronté au problème d'interfacer python avec une DLL, il s'agit du driver d'une interface can/usb de chez IXXAT http://www.ixxat.com/download_vci_v3_en.html. Pour prendre le problème à la base, j'ai créé une dll en C sous code bloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    float __declspec (dllexport) addFloats(float op1, float op2)
    {
        float op3 = op1 + op2;
        printf("C language -> %f + %f = %f\n", op1, op2, op3);
        return op3;
    }
    Je l'ai ensuite chargée et utilisée sans problème sous python:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import ctypes
     
    dll_name = "bin/Release/dummy_dll"
    dynlib = ctypes.CDLL(dll_name)
    dynlib.addFloats.restype = ctypes.c_float
    dynlib.addFloats.argtypes  = [ctypes.c_float, ctypes.c_float]
    op1 = 12.34
    op2 = 23.45
    op3 = dynlib.addFloats(op1, op2)
    print "Python     -> %f + %f = %f"%(op1, op2, op3)
    Le résultat semble prometteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C language -> 12.340000 + 23.450001 = 35.790001
    Python     -> 12.340000 + 23.450000 = 35.790001
    Appuyez sur une touche pour continuer...
    Comme j'ai vu que ça semblait réalisable, je me suis dit que j'allais faire pareil avec la dll de chez IXXAT... Y a t-il un moyen en python pour récupérer les noms des fonctions embarquées dans la dll? python me trouve les noms des fonctions qui viennent directement de la documentation... j'ai essayé toutes les combinaisons en commentant diverses lignes... Ai-je loupé quelquechose?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import ctypes
     
    dll_name = "vciapi"
     
    dynlib = ctypes.cdll.LoadLibrary(dll_name)
    dynlib = ctypes.CDLL(dll_name)
    print type(dynlib), dynlib
    print getattr(dynlib, "VCI_ReadBoardInfo")
    print dynlib.VCI_Init
    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <class 'ctypes.CDLL'> <CDLL 'vciapi', handle 10000000 at 218ff10>
    Traceback (most recent call last):
      File "test_dll.py", line 9, in <module>
        print getattr(dynlib, "VCI_ReadBoardInfo")
      File "c:\python27\lib\ctypes\__init__.py", line 366, in __getattr__
        func = self.__getitem__(name)
      File "c:\python27\lib\ctypes\__init__.py", line 371, in __getitem__
        func = self._FuncPtr((name_or_ordinal, self))
    AttributeError: function 'VCI_ReadBoardInfo' not found
    >Exit code: 1
    A+

    Pfeuh

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    Essayez de voir les exports de la .DLL avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dumpbin /exports <yourDLL>.dll
    note: dumpbin vient avec Visual Studio.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Essayez de voir les exports de la .DLL avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dumpbin /exports <yourDLL>.dll
    note: dumpbin vient avec Visual Studio.
    - W
    Merci wiztricks. Il ne me reste plus qu'à trouver un collègue avec Visual studio.

    A+

    Pfeuh

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Il ne me reste plus qu'à trouver un collègue avec Visual studio.
    Vous pouvez récupérer une version Express chez Microsoft, c'est gratuit.
    Si vous utilisez mingw, il faut récupérer et jouer avec ldd, nm, objdump.
    (nm pour dumper les symboles).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/12/2007, 14h49
  2. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  3. Réponses: 2
    Dernier message: 19/12/2006, 15h51
  4. Réponses: 3
    Dernier message: 06/09/2006, 11h57
  5. Accès dll depuis java avec JNI
    Par romano21 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 25/10/2005, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo