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 :

[COM] Assigner une méthode à un événement


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut [COM] Assigner une méthode à un événement
    Bonjour tout le monde,

    Contexte:
    J'ai un usercontrol en C# que je dois intégrer dans une forme en VB.
    Dans le COMM, je dois accrocher mes méthodes au événements du usercontrol.
    Usercontrol C# -> Wrapper C++/CLI compile en clr -> COMM -> forme VB

    Ce que j'ai fait à date:
    J'ai créé un Wrapper en clr
    J'ai ma méthode en COMM qui est accrochée à un événement de mon usercontrol.

    Problème:
    J'ai assigné la méthode en COMM comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_styleEditorCtrl->OnInfoViewerMouseRClick += gcnew System::Windows::Forms::MouseEventHandler(&CStyleView::OnMouseRClickStyleBrowser);
    Mais la méthode OnMouseRClickStyleBrowser est static et elle utilise des object non statics et ce qui me donne une erreur à la compilation.

    Comment dois-je faire pour assigner ma méthode non static à mon événement?

    Merci d'avance pour les réponses et si vous avez besoin de plus d'informations, n'hésitez pas!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Les pointeurs de fonction ordinaires n'acceptent pas les méthodes non-statiques, mais les délégués, si: Le plus simple est donc de rajouter une méthode non-statique à ton wrapper C++/CLI, qui se charge de l'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    m_styleEditorCtrl->OnInfoViewerMouseRClick += gcnew System::Windows::Forms::MouseEventHandler(this, &MonWrapper::OnMouseRClickStyleBrowser);
     
    private: void OnMouseRClickStyleBrowser(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
    {
    	m_pStyleView->OnMouseRClickStyleBrowser(ConvertirArgumentEvenement(e));
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Merci Médinoc, mais j'obtiens toujours cette même erreur lorsque j'utilise des objets managed
    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
    #include <afxwinforms.h>
     
    #ifndef EXPORT_CATTOOL
    #define EXPORT_CATTOOL __declspec(dllimport)
    #endif
     
    class EXPORT_CATTOOL CStyleEditorWrapper
    {
    	public:
    		CStyleEditorWrapper();
    		Microsoft::VisualC::MFC::CWinFormsControl<CatalogToolsTabControl::StyleEditor::StyleEditor> m_styleEditorCtrl;
     
    	private:
    		void OnMouseRClickStyleBrowser(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e);
    };
    -------------------------
    error C3395: 'CStyleEditorWrapper::OnMouseRClickStyleBrowser' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention
    Connaîtrais-tu un moyen pour régler se problème?
    Merci d'avance!

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    CATTOOL, c'est la DLL que tu cherches à créer?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Oui, CATTOOL est une DLL que je dois créer

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans ce cas, j'ai l'impression que tu ne peux pas exporter une classe non-managée ayant des méthodes managées (même si elles sont privées, apparemment ).

    Donc, tu devrais rendre ta classe CStyleEditorWrapper non-exportée, et exporter seulement le wrapper en C++/CLI.
    Ou bien, t'arranger pour qu'elle soit entièrement non-managée, et ses méthodes aussi (via #pragma unmanaged, etc.).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    D'accord Merci Médinoc, je vais essayer ça!

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Enfin, ça fonctionne!
    Ce n'est pas moi qui ai trouvé la solution, mais mon superviseur.
    On avait déjà regardé ensemble, mais ça n'avait rien donné.
    Durant mes vacances, il s'est penché là-dessus et à trouvé la solution suivante :
    Le Usercontrol en C# est resté le même,
    Le Wrapper en clr a été enlevé,
    Le code en COMM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //-----------StyleView.h-----------
     
    //Déclaration du UserControl
    private : 
            Microsoft::VisualC::MFC::CWinFormsControl<CatalogToolsTabControl::StyleEditor::StyleEditor> m_styleEditorCtrl;
     
    //Création du Delegate
    public :
            void OnMouseRClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e);
     
            BEGIN_DELEGATE_MAP( CStyleView )
                EVENT_DELEGATE_ENTRY( OnMouseRClick, System::Object^, System::Windows::Forms::MouseEventArgs^ )
            END_DELEGATE_MAP()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //-----------StyleView.cpp-----------
     
    //Assignation de la méthode delegate à l'eventHandler en C#
    m_styleEditorCtrl->OnInfoViewerMouseRClick += MAKE_DELEGATE( System::Windows::Forms::MouseEventHandler, OnMouseRClick);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/01/2014, 17h30
  2. Réponses: 5
    Dernier message: 07/08/2008, 18h53
  3. [Evènement]Accrocher un évènement à une méthode
    Par Jabbal'H dans le forum Langage
    Réponses: 5
    Dernier message: 11/04/2008, 12h20
  4. Attacher un évènement à une méthode de la classe courante
    Par hush dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/06/2007, 00h40
  5. [Evénements]Ajout d'une méthode sur un événement d'un bouton
    Par Salam59 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/03/2006, 15h47

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