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

Bibliothèques tierces Python Discussion :

Utilisation d'un controle active X avec pywin32.


Sujet :

Bibliothèques tierces Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Par défaut Utilisation d'un controle active X avec pywin32.
    Bien le bonjour

    Dernièrement, je cherchais une solution pour utiliser un contrôle active X depuis un script python. Script qui est appelé depuis un programme C++.

    J'ai regardé de plus près pywin32 qui semble donner les outils nécessaire à l'utilisation de COM depuis un script python.

    Hélas, peu voire aucune info ne ressort quant à l'utilisation de pywin32 dans le cas d'un contrôle activeX.

    J'ai suivis la méthode indiqué dans de nombreuses docs à ce sujet, indiquant de faire comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import win32com.client
    ax = win32com.client.Dispatch("SplActiveX.SplActiveXCtrl.1")

    Jusqu'ici tout va bien, l'interpréteur python ne me sort aucune erreur. Par contre, si j'essaye d'atteindre une méthode de mon controle active X avec :



    L'interpréteur m'indique l'erreur suivante :

    Traceback (most recent call last):
    File "<interactive input>", line 1, in <module>
    File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 512, in __getattr__
    raise AttributeError("%s.%s" % (self._username_, attr))
    AttributeError: SplActiveX.SplActiveXCtrl.1.test


    J'avoue être un peu perdu et ne sais pas quoi faire.

    J'ai tenté de générer une interface avec makepy en faisant un makepy.py de SplActiveX.ocx mais ça semble ne servir à rien.

    Help !

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Regarde plutôt de module comtypes qui est de mon point de vue plus facile à manipuler:
    http://sourceforge.net/projects/comtypes/

    documentation:
    http://starship.python.net/crew/theller/comtypes/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Par défaut
    Je te remercie grandement pour ce conseil, je vais me pencher un peu plus en détail sur ce module qui me semble très prometteur =)

    Merci beaucoup !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Par défaut
    Bien le bonjour !

    J'ai quelques soucis avec l'utilisation de comtypes. Si je tente d'utiliser des objets COM tels qu'Excel ou Word, pas de soucis, les classes python sont bien générées et je peux m'en servir par la suite.

    Par contre, lorsque je tente de charger une simple dll, ou si j'essaye d'utiliser un contrôle ActiveX de mon cru, cela ne marche pas.

    Pour plus de détails, voici ce qu'il se passe si je tente d'utiliser une dll :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> from comtypes.client import GetModule
    >>> dll = GetModule("C:\Documents and Settings\bcramillet\Mes documents\Prototype\Plugin\test.dll")
     
    Traceback (most recent call last):
      File "<pyshell#11>", line 1, in <module>
        dll = GetModule("C:\Documents and Settings\bcramillet\Mes documents\Prototype\Plugin\test.dll")
      File "C:\Python27\lib\site-packages\comtypes\client\_generate.py", line 97, in GetModule
        tlib = comtypes.typeinfo.LoadTypeLibEx(tlib)
      File "C:\Python27\lib\site-packages\comtypes\typeinfo.py", line 480, in LoadTypeLibEx
        _oleaut32.LoadTypeLibEx(c_wchar_p(szFile), regkind, byref(ptl))
      File "_ctypes/callproc.c", line 936, in GetResult
    WindowsError: [Error -2147312566] Erreur lors du chargement de la bibliothèque/DLL du type
    Dans le cas où je souhaite utiliser un contrôle ActiveX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    >>> from comtypes.client import CreateObject
    >>> ax = CreateObject("SplActiveX.SplActiveXCtrl.1")
    # Generating comtypes.gen._50F8C3CD_3BF0_44A4_BBE6_219E924F8091_0_1_0
     
    Traceback (most recent call last):
      File "<pyshell#16>", line 1, in <module>
        ax = CreateObject("SplActiveX.SplActiveXCtrl.1")
      File "C:\Python27\lib\site-packages\comtypes\client\__init__.py", line 242, in CreateObject
        return _manage(obj, clsid, interface=interface)
      File "C:\Python27\lib\site-packages\comtypes\client\__init__.py", line 188, in _manage
        obj = GetBestInterface(obj)
      File "C:\Python27\lib\site-packages\comtypes\client\__init__.py", line 110, in GetBestInterface
        mod = GetModule(tlib)
      File "C:\Python27\lib\site-packages\comtypes\client\_generate.py", line 112, in GetModule
        mod = _CreateWrapper(tlib, pathname)
      File "C:\Python27\lib\site-packages\comtypes\client\_generate.py", line 176, in _CreateWrapper
        generate_module(tlib, ofi, pathname)
      File "C:\Python27\lib\site-packages\comtypes\tools\tlbparser.py", line 708, in generate_module
        items = p.parse()
      File "C:\Python27\lib\site-packages\comtypes\tools\tlbparser.py", line 600, in parse
        self.parse_typeinfo(tinfo)
      File "C:\Python27\lib\site-packages\comtypes\tools\tlbparser.py", line 570, in parse_typeinfo
        return self.ParseDispatch(tinfo, ta)
      File "C:\Python27\lib\site-packages\comtypes\tools\tlbparser.py", line 305, in ParseDispatch
        itf.doc = str(doc.split("\0")[0])
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 12: ordinal not in range(128)
    J'avoue être un peu perdu, je ne m'y connais pas trop en objets COM Je ne vois pas trop ce qu'il faut faire au préalable pour que ça marche.

  5. #5
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Pour le premier code, il faut faire attention avec les backslash dans les string (soit les doubler soit utiliser des rawstring)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dll = GetModule(r"C:\Documents and Settings\bcramillet\Mes documents\Prototype\Plugin\test.dll")
    Pour le deuxième code, teste en installant Python 3 (et comtypes pour python 3) vu que le problème a l'air d'être un problème de la gestion unicode des caractères ou bien tu peux tenter de modifier le fichier tlbparser.py et la ligne 305 en enlevant le cast en str
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    itf.doc = doc.split("\0")[0]

Discussions similaires

  1. Controler la souris avec un gamepad
    Par RLX dans le forum Windows
    Réponses: 9
    Dernier message: 30/10/2008, 17h40
  2. Installation d'un controle active X avec regsrv32
    Par Stargate SG1 dans le forum Access
    Réponses: 2
    Dernier message: 15/09/2007, 12h33
  3. Réponses: 5
    Dernier message: 13/09/2006, 16h47
  4. Réponses: 1
    Dernier message: 20/08/2006, 17h34
  5. [XP]controle a distance avec ip dynamique
    Par Dnx dans le forum Hardware
    Réponses: 1
    Dernier message: 08/02/2005, 21h22

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