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
Output :
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");
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Start server : Success COM Server Registration : Success
Code python :
Code Perl :
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) >>>
Result :
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";
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 : Sélectionner tout - Visualiser dans une fenêtre à part GetActiveObject failed at c:\Perl\Test\QtComAppTest.pl line 4.
Code Python :
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 ?
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 >>>
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.
Partager