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 :

lien entre classes managed et unmanaged


Sujet :

C++/CLI

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Par défaut lien entre classes managed et unmanaged
    Bonjour à tous.

    J'ai présentement un gros problème de "compatibilité" entre du code natif et du code managed (CLI)

    Mon problème est le suivant.

    J'ai une interface en C# (A), une façade en C++(CLI)(b) managed et une classe en C++ native (C).

    Donc, lorsque je démarre l'interface, cela va comme suit.

    (A) a un pointeur vers (B) qui a un pointeur vers (C)

    (A) -> (B) -> (C)

    Ailleurs dans mon environnement, j'ai un autre processus (en c++ natif) qui peut envoyer des evenements à (C)

    J'aimerais, lorsque je reçoit ces evenements que C communique a B les données qui ensuite mettera a jour une Form dans A.

    Ou je bloque, c'est la communication de C vers B.... (unmanaged vers managed) Malheureusement je ne peux avoir de back pointer vers B dans C

    Avez vous une idée de comment je pourrais regler mon problème.
    Je suis malheureusement pris avec ces technologies....

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il existe la classe gcroot qui permet d'avoir une classe C++ possédant un handle managé (dans mon cas, j'utilise une version weak inspirée de cette même classe, car je n'ai pas envie que mon évènement fasse survivre l'objet managé).

    Pour plus de détails, il faudrait connaître le mécanisme d'évènements que tu utilises. J'utilise pour ma part boost::signal.


    Donc, dans B, je définis une variable de type gcroot<B> pointant sur *this. J'accroche grâce à bind dans le constructeur de B des fonctions libres aux évènements émis pas C. Ces fonctions libres (pure C++, donc accrochables à l'évènement) prennent en paramètre un gcroot<B>, ainsi que les autres paramètres voulus par l'évènement.

    Dans ces fonctions libres, je récupère b à partir du gcroot<B>, et voilà !
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Par défaut
    Si je comprends bien, je pourrais dans b déclaré un objet de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcroot<b> uneInstanceDeB = *this;
    ensuite, j'instancie dans B la classe C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C uneInstance = new C();
    par la suite je peux faire la chose suivante :

    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
     
    c->setInstanceOfB(uneInstanceDeB);
     
    /// et puis dans C
     
    void setInstanceOfB(gcroot<b> unB)
    {
         /// mInstanceOfB est une variable membre...
         mInstanceOfB = unB;
    }
     
    /// lors de la reception de l'event dans C
     
    void eventRecuDansC(Info lesInfosAUpdater)
    {
        mInstanceOfB->updateInfo(lesInfosAUpadater);
    }

    Est-ce que tout ça a du sens???

    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ça devrait marcher, même si je ne considère pas ça comme idéal, car ça ne reprends pas vraiment la philosophie d'un évènement. En effet, dans ce que tu proposes, C doit savoir qu'il est observé par un B, et doit contenir dans son implémentation du code C++/CLI.

    Dans ce que je proposais, C est une classe pur C++, dans l'interface comme dans l'implémentation, et ne sait pas par qui elle va être observée. Elle fourni juste un mécanisme d'event C++ à qui est intéressé.

    C'est B qui fait le pont entre les deux mondes, ce qui tombe bien, elle est là pour ça. Elle va s'accrocher au mécanisme d'event par l'intermédiaire de son gcroot.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. WebService et ComplexType : lien entre classes
    Par macben dans le forum JWS
    Réponses: 1
    Dernier message: 01/10/2009, 10h11
  2. Liens entre classes Monad, Functor, etc.
    Par limestrael dans le forum Haskell
    Réponses: 15
    Dernier message: 11/08/2009, 20h10
  3. liens entre classes
    Par gate35 dans le forum Débuter
    Réponses: 7
    Dernier message: 28/05/2009, 17h01
  4. Réponses: 7
    Dernier message: 28/04/2009, 17h46
  5. Echange d'objet entre classe managée et non managée
    Par alexadvance dans le forum C++/CLI
    Réponses: 15
    Dernier message: 13/04/2007, 14h45

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