Partage
  • Partager sur Facebook
  • Partager sur Twitter

Module comtypes

Pour utiliser des objets COM

    19 novembre 2010 à 15:28:45

    Bien le bonjour !

    Je cherche à utiliser des objets COM depuis un script Python. Ce script étant d'ailleurs interprété depuis une application C++, mais là n'est pas la question.
    Dans un premier temps, pour y parvenir, j'ai essayé d'utiliser le module pyWin32 qui m'a semblé un peu lourd et pas forcément très pratique à utiliser. On m'a alors conseillé le module comtypes, qui par contre est très léger et relativement facile à utiliser.

    Le soucis, c'est que je n'arrive pas à me servir de ce module pour les contrôles ActiveX que j'ai créé. Le problème étant la génération du module python à partir de l'objet COM. Dans le cas d'un objet COM tel qu'une application Excel ou Word : pas de problème, la génération se déroule parfaitement bien, en revanche, avec mes propres contrôles activeX, ce n'est pas la même.

    Voici les quelques lignes de code que j'ai testé en console et les messages d'erreurs qui me sautent au visage :

    >>> from comtypes.client import *
    >>> ax = CreateObject("DEFAULTPROJECT.DefaultProjectCtrl.1")
    # Generating comtypes.gen._36658913_FB39_4E05_8F3C_71FA859660BC_0_1_0
    
    Traceback (most recent call last):
      File "<pyshell#3>", line 1, in <module>
        ax = CreateObject("DEFAULTPROJECT.DefaultProjectCtrl.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)
    


    Si j'essaye de passer par un GetModule avec le .tlb de mon contrôle j'obtiens ceci :

    >>> gm = GetModule("C:\Documents and Settings\bcramillet\Mes documents\Sources\Default Solution\Default Project\Debug\DefaultProject.tlb")
    
    Traceback (most recent call last):
      File "<pyshell#4>", line 1, in <module>
        gm = GetModule("C:\Documents and Settings\bcramillet\Mes documents\Sources\Default Solution\Default Project\Debug\DefaultProject.tlb")
      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
    


    Et si je tente aussi un GetModule avec le CLSID de mon contrôle, j'obtiens la même chose que pour le CreateObject, (logique du coup).

    Je viens donc ici en quête d'une aide / explication potentielle car je nage un peu dans le brouillard :(

    Puissiez vous m'éclairer !

    A tantôt !
    • Partager sur Facebook
    • Partager sur Twitter

    Module comtypes

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown