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

C++/CLI Discussion :

Communication entre composants COM


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut Communication entre composants COM
    Bonjour,

    Comment faire communiquer deux composants COM natifs dans un application c#, sachant que ces composants créent chacun des threads?
    J'arrive à accéder à chacun des composants depuis l'application pour envoyer des donner. Mais je n'arrive pas à envoyer des données reçues du composant COM 1 au composant COM 2.
    Les composants sont créés dans le thread d'interface t1 qui est en STA (a cause de wpf).
    Le composant COM 1 (MTA) génère des données dans un thread 2 et doit les envoyer au composant COM 2 (MTA).
    Y a t il une architecture type à respecter?
    Merci pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    j'ai pu m'en sortir en utilisant un thread qui crée les deux composants COM plus une fenêtre fantôme pour utiliser sa pompe à message.

    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
    16
    17
    18
    19
     
            public void Start()
            {
                Thread t1 = new Thread(new ThreadStart(DispatcherThread));
                t1.SetApartmentState(ApartmentState.STA);
                t1.IsBackground = true;
                t1.Start();
            }
     
            public void DispatcherThread()
            {
               // création des objects COM
               // ...
     
               // création de la fenêtre fantôme qui dérive de Window
                GhostWindow.GhostInstance = new GhostWindow();
               // mettre en route la pompe à message
                System.Windows.Threading.Dispatcher.Run();
            }
    Quand je veux faire communiquer mes composants alors qu'ils ont créé en interne des threads différents, j'utilise le dispatcher de ma fenetre fantome

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void DoJobCallback(object sender, object obj1)
            {
                if (sender != null)
                {
                    // transfer through the dispatcher
                    GhostWindow.GhostInstance.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (MyDelegate)DoJobCallback, null, obj1);
                    return;
                }
                // Do the job here
                // ...
            }
    Il n'en reste pas moins que sur les deux composants COM, l'un s'utilise facilement depuis n'importe quel thread, tandis que l'autre me fait une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     The call to QI for interface 'SCANNINGMODULELib.IScanningEngine' with IID '{53B1F314-E4DA-496B-880E-7C5E35AD735C}' failed with HRESULT 0x80004002 (No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))). One likely reason this failed is that the object does not have a proxy/stub dll properly registered
    si je ne passe pas par mon thread avec la pompe à message.
    Je ne comprends pas ce qui les différencie.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Salut.

    J'ai le même souci que toi. Impossible d'utiliser un composant COM dans un thread autre que celui dans lequel il a été créé (des histoires de MTA/STA) semble-t-il. Et bien sur pour le gui pas moyen de se passer de STA. Alors que COM c'est majoritairement du MTA. J'ai entendu parlé des "PointerMarshallingStreamMachinBidule", mais pas d'exemple vraiment utilisable et compréhensible.

    C'est assez rageant de devoir trouver des bidouilles à deux balles pour contourner le problème...

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Je me suis intéressé de plus prêt aux composants COM que j'utilisais. Car un des deux ne me posait pas de problème, il était accessible depuis n'importe quel thread. J'ai étudié leurs différences et il se trouve qu'en comblant une d'entre elles j'ai trouvé la solution.
    Dans le fichier .idl il fallait spécifier les interfaces comme étant "dual".
    Je n'ai pas trouvé vraiment d'article m'expliquant pourquoi. Si quelqu'un connait qu'il n'hésite pas à partager

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Merci pour l'info.

    J'ai voulu tester, mais difficile encore pour moi de faire passer mes interfaces sous IDispatch, il me manque des connaissances en la matière et surtout le code d'implémentation.

Discussions similaires

  1. Problème de compatibilité entre composant COM et 64 bits
    Par Raymonde dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 17/09/2012, 18h05
  2. Réponses: 1
    Dernier message: 18/01/2008, 13h17
  3. [COM | VB] communication entre application hétérogène
    Par zlavock dans le forum Général Java
    Réponses: 8
    Dernier message: 21/11/2004, 10h51
  4. Composants communs entre Ver Entreprise et Professionnelle
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/03/2004, 13h07

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