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

Discussion :

[ActiveQt] Utilisation d'un serveur COM depuis un script

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut [ActiveQt] Utilisation d'un serveur COM depuis un script
    Hello tout le monde,

    Je suis actuellement en train de me documenter sur la création d'un serveur d'object COM sous Windows avec Qt. J'arrive à compiler et à lancer le serveur, mais impossible de m'y connecter depuis une application client. J'utilise Python et Perl comme client mais sans succès.

    Explication :

    Pour commencer j'ai simplement essayer de reprendre le premier exemple fournit par la doc de Qt sur ce sujet : ComApp.

    Au niveau du serveur, tout semble fonctionner. Les functions QAxFactory::startServer et QAXfactory::registerActiveObject renvoient bien true indicant que le serveur est lancé et enregistré dans la base de registre Windows. Jusque là, tout va bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    qDebug() << "Start server : " << (QAxFactory::startServer() ? "Success" : "Fail");
    qDebug() << "COM Server Registration : " << (QAxFactory::registerActiveObject(&appobject) ? "Success" : "Fail");
    Output :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Start server : Success 
    COM Server Registration :  Success
    Le problème c'est que lorsque j'essaie d'atteindre mon serveur depuis un script avec GetActiveObject('comapp.Application'), je reçois une erreur "Invalid Class string", ce qui signifie que mon serveur n'est pas enregistré.

    Code python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> from win32com.client import *
    >>> comApp = GetActiveObject('comapp.Application')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python32\lib\site-packages\win32com\client\__init__.py", line 78, in GetActiveObject
        resultCLSID = pywintypes.IID(Class)
    pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
    >>>
    Code Perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    use Win32::OLE;
     
    $ex = Win32::OLE->new('comapp.Application', sub {$_[0]->Quit;}) 
    		   or die "GetActiveObject failed";
    Result :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetActiveObject failed at c:\Perl\Test\QtComAppTest.pl line 4.
    Par contre j'observe un phénomène étrange, si j'utilise directement le ClassID de la classe Application (voir Com app exemple), j'arrive à obtenir un object sans erreur, mais inutilisable, dans le sens ou aucune fonctions ou proprietés ne sont accessible. Ce qui ne m'avance pas beaucoup...

    Code Python :
    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
    >>> from win32com.client import GetActiveObject
    >>> comapp = GetActiveObject('{4728861D-74E9-445a-AE0C-7EF0BC200E57}')
    >>> print(comapp.id)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 516, in __getattr__
        raise AttributeError("%s.%s" % (self._username_, attr))
    AttributeError: {4728861D-74E9-445a-AE0C-7EF0BC200E57}.id
    >>> comapp.visible
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 516, in __getattr__
        raise AttributeError("%s.%s" % (self._username_, attr))
    AttributeError: {4728861D-74E9-445a-AE0C-7EF0BC200E57}.visible
    >>>
    Autre observation, si j'essaye d'obtenir un objet avec un ClassID des classes Document ou DocumentList, mon serveur crash. Ces classes ne sont pas prévues pour être instanciées directement, mais cela ne devrait pas crasher mon serveur non ?

    J'ai essayé, en vain, de rechercher le ClassID dans la base de registre. Il semble donc qu'il y ait un problème au niveau de l'enregistrement de l'objet COM dans la base de registre. Alors que QAxFactory::registerActiveObject renvoi bien true, ce qui d'après la doc Qt indique que l'enregistrement c'est bien passé.

    Dans le désespoir j'ai fait une recherche sur tous les UUID présent dans l'exemple, mais aucun n'as été trouvé. J'ai aussi recherché le mot clef "comapp.Application" (nomProjet.nomObjet) qui semble être le nom donné au serveur COM d'après l'exemple. Mais aussi sans succès.

    Avec un peu de chance l'un d'entre vous à déjà une expérience dans ce domaine et pourra peut être m'éclairer.

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut Personne ?
    Bonjour,

    Ce poste est-il au mauvais endroit ? Ma question n'est elle pas bien énoncée ? Ou alors vraiment personne n'as d'expérience dans ce domaine ?

    Merci de me l'indiquer dans ce cas.

    N'ayant pas de réponse, ni même de commentaire, je commence à désespérer. Si quelqu'un n'as ne serait-ce qu'une petite piste qui me permettrait de creuser ce problème, qu'il n'hésite pas à se manifester.

    Merci...

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut Résolu avec le compilateur VS2008
    Bonjour,

    Je poste la "solution" pour ceux que ça intéresse.
    En fait j'ai résolu mon problème tout simplement en utilisant le compilateur de VS2008 au lieu de mingw.

    Par contre je n'ai pas trouvé d'explication sur ce point, mais je n'ai pas vraiment cherché...

    J'imagine que COM étant un système provenant de Microsoft, seul leur compilateur permet d'exporter des object COM. Mais ce ne sont que des suppositions, donc si quelqu'un connaît la réponse, j'apprécierais grandement ses explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'un Object COM depuis une DLL
    Par jdflaugergues dans le forum C#
    Réponses: 0
    Dernier message: 16/04/2014, 16h25
  2. Réponses: 1
    Dernier message: 01/07/2008, 12h33
  3. Réponses: 6
    Dernier message: 05/03/2008, 14h31
  4. Quel logiciel utiliser pour un serveur ftp
    Par jean-jacques varvenne dans le forum Réseau
    Réponses: 11
    Dernier message: 01/04/2005, 20h09
  5. [C#] Utiliser plusieurs formulaires serveur
    Par Anomaly dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/10/2003, 19h38

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