none
plugin outlook ATL C++, threads secondaires (Qt) RRS feed

  • Question

  • Bonjour,

    peut on creer des threads secondaires QT avec leur boucle d'evenement depuis des objets Qt, dans un objet COM de type appartement.(mon objet COM de mon plugin Outlook).Apparemment je ne vais pas dans le slot(handler) de l'objet lié au thread Qt apres avoir envoyé un signal depuis un objet Qt.j'ai mis une trace et elle n'apparait pas dans le slot.Faut il faire l'objet COM du plugin d'une autre maniere qu "appartment"  ou est ce que appartment est le bon choix?

    mardi 30 juin 2015 14:48

Réponses

  • QueryInterface permet simplement d'obtenir une interface de dialogue avec les composants COM. Il n'y a aucun problème pour appeler des méthodes du composant STA à partir du MTA.

    Toutefois votre problème est plus complexe puisque le STA est l'appelant et qu'il ne devrait pas bloquer en attente du STA (d'autant plus qu'il n'écoute que sur un thread). Ce que vous devriez faire est de l'évènementiel afin de ne pas bloquer le thread appelant du STA. Autrement dit, le composant COM STA appelle celui MTA et sera contacté sur une méthode spécifique d'une interface spécifique (on appelle cela une callback)

    C'est plus long à coder, mais beaucoup plus propre. En terme COM, vous pouvez le faire de 2 façons, soit avec un code compatible tout langage pouvant cibler COM, soit uniquement pour C++.

    Voici 2  liens très intéressants pour commencer : Understanding COM-Event Handling et C++ Event Sinks Sample

    jeudi 2 juillet 2015 09:29
  • en derniere remarque il y a un module de Qt, peu utilisé apparemment, qui normalement permet de faire du COM ,activeQt, mais il faut faire tout le projet en activeQt pour que cela fonctionne je pense (j'avais essayé un autre projet dans ce sens mais j'etais bloqué)...La j'avait choisi de le faire en ATL microsoft finalement.
    jeudi 9 juillet 2015 08:38

Toutes les réponses

  • Bonjour,

    Les Apartments sont liés aux composants COM. Dans votre cas, votre plugin est un STA (Single Threaded), mais il y en a d'autres comme le "Main STA", "MTA" (Multi-threaded) ou FTA (Free Threaded).

    Vous n'utiliseriez pas Qt et parleriez de multithreading COM, je vous dirais de cibler du Both (composant COM pouvant être à la fois STA, MTA, FTA en fonction du cas de figure) en utilisant le FTM (Free Threaded Marshaller).

    Dans votre cas, s'agissant d'un plugin, le STA semble logique car il y a une interface visuelle (et donc une datapump de messages pour écouter les entrées vers le composant COM et les dispatcher).

    Il n'y a pas de problématique technique à créer des threads dans un STA mais il faut réaliser que le composant COM ne peut dans ce cas écouter des messages que sur le thread qui l'a créé.

    Est-ce que QT se retrouve pommé dans la datapump de messages ? Possible... Je ne sais pas comment QT a été implémenté sous Windows ? Est-ce possible de s'en sortir ? Probablement... Puisque Qt devrait très logiquement ne pas se préoccuper des Apartments (sauf s'il a été implémenté en respectant ce principe).

    Vous avez donc 2 options... La première, farfouiller à fond pour voir si un principe COM n'est pas violé.... La deuxième implémenter votre composant QT dans un MTA, puis faire une communication entre le plugin STA et le composant nouvelle créé.

    J'ai toutefois une remarque... Pourquoi mettre du Qt là où la technologie ActiveX (avec COM) est particulèrement adaptée ^^ ?

    Bien cordialement,


    Fabrice JEAN-FRANCOIS, Novencia TS


    mardi 30 juin 2015 16:56
  • Bonjour,

    merci pour ces eclaircissements effectivement le plugin est un STA.

    pourquoi je veux utiliser Qt ? parce que j'ai besoin d'utiliser des classes de communication http dejà developpées dans un logiciel Qt et parce que celà me prendrai beaucoup plus de temps pour le refaire avec les win32 je suppose.apres le seul probleme est les signaux/slots et les threads de Qt sinon par exemple la classe QString est beaucoup plus pratique que les BSTR pour manipuler des chaines de caracteres.

    mercredi 1 juillet 2015 07:40
  • rebonjour,

    et si je cree une deuxieme composant MTA,j'aurais besoin d'appeler deux fonctions de mon composant Qt dans l objet MTA a partir du composant STA et aussi de retourner au STA que chacune de ces operations est terminée.

    concretement comment communiquer entre l'objet STA et l'objet MTA ?

    mercredi 1 juillet 2015 09:44
  • Bonjour,

    Je comprends mieux le besoin^^.

    Pour la petite histoire, une solution full Microsoft à base de C++/CLI aurait pu être adaptée. Elle nécessite l'utilisation du framework.NET (mais nombre de machines le possède déjà), mais offre toute la puissance de .NET au développeur C++. La communication C++ et C++/CLI est agréable, on utilise le type String^ pour la création de chaînes dont la mémoire est gérée, on a toutes les API pour faire de l'HTTP, du multithread, etc.

    La communication entre des composants COM en Apartment STA et MTA est transparente. Sans vous en rendre compte une proxy et une stub seront créés pour permettre l'échange entre la STA et la MTA ainsi qu'un thread de switch pour s'assurer qu'il n'y a pas d'effets de bord.  Votre objet COM dans le STA doit faire un CoCreateInstance/CoCreateInstanceEx adéquat du composant COM dans le MTA ainsi qu'un QueryInterface pour accéder à la ou aux méthodes exposées par le MTA.

    Cette ou ces méthodes feront ensuite toute la logique Qt de communication et retourneront en douceur le résultat (en espérant que celui-ci soit simple sinon il faudra l'encapsuler dans un nouvel object COM faisant parti du MTA)


    mercredi 1 juillet 2015 14:59
  • et est il possible depuis le MTA d'acceder a des methodes du STA avec QueryInterface ou alors d'envoyer un message windows utilisateur au STA,(qui attend avec 
    MsgWaitForMultipleObjects)
    pour signaler precisement au STA qu on a recu une reponse http à la requete http envoyee par le MTA-module Qt- (mais initialisée par le STA) ?
    jeudi 2 juillet 2015 07:42
  • QueryInterface permet simplement d'obtenir une interface de dialogue avec les composants COM. Il n'y a aucun problème pour appeler des méthodes du composant STA à partir du MTA.

    Toutefois votre problème est plus complexe puisque le STA est l'appelant et qu'il ne devrait pas bloquer en attente du STA (d'autant plus qu'il n'écoute que sur un thread). Ce que vous devriez faire est de l'évènementiel afin de ne pas bloquer le thread appelant du STA. Autrement dit, le composant COM STA appelle celui MTA et sera contacté sur une méthode spécifique d'une interface spécifique (on appelle cela une callback)

    C'est plus long à coder, mais beaucoup plus propre. En terme COM, vous pouvez le faire de 2 façons, soit avec un code compatible tout langage pouvant cibler COM, soit uniquement pour C++.

    Voici 2  liens très intéressants pour commencer : Understanding COM-Event Handling et C++ Event Sinks Sample

    jeudi 2 juillet 2015 09:29
  • merci beaucoup,je vais essayer de developper avec un deuxieme composant MTA en suivant vos conseils (de toute facon si mon composant QT en voulait pas fonctionner dedans, au pire je peux le redevelopper avec les win32 et la librairie wininet , dans mon composant MTA)
    jeudi 2 juillet 2015 10:21
  • j'ai une derniere question: dans le wizard de creation d'objet COM de visual studio 2013 on a l'option free pour un MTA et neutral.il ne vaudrait pas mieux que je choisisse neutral pour mon MTA pour integrer mes composants Qt dedans ?
    jeudi 2 juillet 2015 13:32
  • Oui, je parlais de façon générique ^^... Si on choisit Neutral, il n'y a plus de MTA mais un apartment neutral... Qui est une façon plus légère de gérer les appels entre apartment. Vous pouvez complètement partir sur cette implémentation ^^
    jeudi 2 juillet 2015 14:04
  • non finalement j'ai choisi free plutot que neutral dans le wizard pour le deuxieme composant(le MTA).....
    jeudi 2 juillet 2015 14:05
  • Bon visiblement en conclusion, la technologie Qt ne passe pas meme dans un composant MTA puisque j'ai fait une deuxieme composant MTA.les signaux /slots ne passent pas et probablement aussi les threads Qt et les eventloops.

    Donc je vais refaire mes composants Qt en technologie microsoft probablement avec des classes ATL voire MFC si on peut inclure les MFC dans un objet COM sinon ce sera juste ATL.Apparemment il y a une classe CString dans ATL et aussi d'autres classes utiles pour moi.je vais quand meme utiliser mon objet MTA car je vais refaire ces composants Qt en technologie microsoft dans mon 2 eme composant MTA car j'ai besoin du multithreading....


    mercredi 8 juillet 2015 15:37
  • en derniere remarque il y a un module de Qt, peu utilisé apparemment, qui normalement permet de faire du COM ,activeQt, mais il faut faire tout le projet en activeQt pour que cela fonctionne je pense (j'avais essayé un autre projet dans ce sens mais j'etais bloqué)...La j'avait choisi de le faire en ATL microsoft finalement.
    jeudi 9 juillet 2015 08:38
  • et bien en fait j'ai refait mon composant Qt avec de la technologie microsoft dans mon deuxieme objet Com et cela fonctionne (pas completement fini).....

    mercredi 29 juillet 2015 18:59