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

MFC Discussion :

Modification de la "message map" à l'execution ?


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut Modification de la "message map" à l'execution ?
    Bonjour,

    Je suis nouveau sur le forum... il est probable que le sujet ai été débattu, mais la fonction de recherche ne m'a pas permi de cerner rapidement un nombre suffisament restreint de fil à lire. Alors je soumets mon probleme :

    Je souhaite modifier un handler (en fait substituer un handler par un autre, du même type) lors de l'excution d'un programme. Celui-ci est developpé avec VS 2005 en utilisant les MFC.

    D'après ce que j'ai pu constater, la table des messages MFC est faite pour être statique. Mais j'ai également vu sur le net que des "workaround" était possible... seulement, plusieurs solutions tendent vers la reécriture d'un framework autorisant les tables dynamiques - too much pour moi.

    Je veux seulement, pour un message en particulier, pouvoir remplacer un Handler_A associé à ce message par un Handler_B :
    Soit une classe CTestAppDialog dérivant de CDialog,
    Soit un message ON_EVENEMENT (n'importe quoi, un clic souris, une frappe clavier), on lui associe un Handler OnEvenementProcess_A() dans le
    MESSAGE_MAP. Puis on souhaite remplacer, a l'exécution, OnEvenementProcessType_A() par OnEvenementProcessType_B() dans la table.
    Comme il s'agit,finalement de pointeurs sur fonction (quelque part dans les structures complexes genre AFX_MSGMAP_ENTRY) ca devrait être possible.

    Alors comment faire simplement ?
    Merci d'avance
    Bernard

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Je dirais à priori que c'est une mauvaise idée de vouloir trifouiller dans les structures internes des MFC. Rien ne te garantie une pérennité et tu risques de passer plus de temps en 'bidouille' qu'autre chose. Plusieurs solutions:
    -> Sublcasser ta fenêtre ()
    -> Récupérer le message dans un OnEvenementProcess qui ensuite invoque OnEvenementProcess_A ou OnEvenementProcess_B via un mécanisme interne que tu mets en place (pointeur de fonction, état, foncteur...).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Je dirais à priori que c'est une mauvaise idée de vouloir trifouiller dans les structures internes des MFC. Rien ne te garantie une pérennité et tu risques de passer plus de temps en 'bidouille' qu'autre chose.
    D'accord avec cela, mais c'est une action "one shoot", pour un developpement particulier, qui n'aura probalement pas de réutilisation ailleurs.

    Citation Envoyé par 3DArchi Voir le message
    -> Récupérer le message dans un OnEvenementProcess qui ensuite invoque OnEvenementProcess_A ou OnEvenementProcess_B via un mécanisme interne que tu mets en place (pointeur de fonction, état, foncteur...).
    En fait, c'est ce que je voulais eviter, car quelque soit le mécanisme, il y a une indirection (un test, l'appel d'une fonction, ...). Je souhaitais changer le pointeur sur fonction pour embrayer sur le bon handler dès reception du message, l'application est critique en temps de calcul, le handler en question est apellé environ 100 x par seconde.

    Les evenements proviennent d'un ActiveX, et la "message map" à modifier est "EVENTSINK_MAP". En fait, j'arrive à décripter la table, mais je ne peux pas modifier le pointeur sur fonction. Il me semble que les macros MFC "DECLARE_EVENTSINK_MAP", "BEGIN_EVENTSINK_MAP", etc... utilisent partout le mot clé "const". Mes tentatives de modification de la table se soldent par un "0xC0000005: Violation d'accès lors de l'écriture" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    AFX_EVENTSINKMAP_ENTRY* my_pMap = (AFX_EVENTSINKMAP_ENTRY*)this->eventsinkMap.lpEntries;
     
    // itération à l'interieur de la table des message
    if(my_pMap[i].dispEntry.lDispID == 5 ) // c'est la liaison event-handler que je souhaite modifier
        my_pMap[i].dispEntry.pfn = (AFX_PMSG)&CTestAppDlg::OnNouveauHandler; 
    // ici ca plante : 0xC0000005: Violation d'accès lors de l'écriture
    Il me semblait que "const" servait de verification lors de la compilation ?
    Or le code compile sans erreurs ... mais génére une erreur lors de l'accès à l'écriture lors de l'execution. Bizzare !

    Any hints ?
    Bernard

Discussions similaires

  1. [MFC-QT]message map dynamique
    Par farscape dans le forum MFC
    Réponses: 4
    Dernier message: 03/03/2005, 15h33

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