[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. :calim2:
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 :ccool:
Code:
1 2 3
|
qDebug() << "Start server : " << (QAxFactory::startServer() ? "Success" : "Fail");
qDebug() << "COM Server Registration : " << (QAxFactory::registerActiveObject(&appobject) ? "Success" : "Fail"); |
Output :
Code:
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:
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:
1 2 3 4
| use Win32::OLE;
$ex = Win32::OLE->new('comapp.Application', sub {$_[0]->Quit;})
or die "GetActiveObject failed"; |
Result :
Code:
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:
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. :cry:
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.
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é... :roll:
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.