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++ Discussion :

Passer un pointeur d'instance à une fonction membre static?


Sujet :

C++

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut Passer un pointeur d'instance à une fonction membre static?
    Bonjour,

    j'ai un problème pour passer un pointeur sur une instance ou l'adresse de l'instance à une fonction callback Windows.

    Je m'explique
    J'ai créé une classe Midi qui utilise des fonctions midi de Windows

    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
    20
    21
    22
    23
    24
    25
    26
    27
    class Midi
    {
      HMIDIIN  hMidiIn ;           //Handle d'entrée MIDI
      MIDIHDR midiHdr;          //Variable de type structure MIDIHDR
     
      //D'autres variables membres
      //.......
     public:
     
      static void CALLBACK MidiIn_cb (HMIDIIN hMidiIn, UINT uMsg, DWORD 
                    dwInstance,  DWORD dwParam1, DWORD dwParam2);   
     
      void StartMidiIn(void *pInst); 
    };
     
     
    void Midi::StartMidiIn(void *pInst)
    {
         if (midiInOpen(&hMidiIn, 0, (DWORD)MidiIn_cb, 0, CALLBACK_FUNCTION))
     
        //Suite du code
       //......
    }
     
    //plus loin dans le code
    Midi record;
    record.StartMidiIn(&record);

    le flag CALLBACK_FUNCTION dans midiInOpen, dit à Windows d'appeler la fonction callback qui est passée en 3eme paramètre (MidiIn_cb dans mon cas).
    On peut donner le nom qu'on veut à la fonction callback, par contre elle doit avoir des paramètres précis.

    La fonction callback attend les paramètres suivants:
    1: le handle d'entrée Midi
    2: la nature du message Midi
    3: une valeur de notre choix (passée par midiInOpen)
    4 et 5: les différentes valeurs du message Midi récupéré par Windows.

    Cette fonction étant static elle ne reçoit donc pas de pointeur this.
    Aussi, je n'arrive pas à voir comment je pourrais lui passer un pointeur sur l'instance ou l'adresse de l'instance qui l'a invoquée.
    J'ai bien sur pensé au 4eme paramètre de midiInOpen (un DWORD de notre choix) qui est passé à la fonction callback (DWORD dwInstance) à chaque fois que celle-ci est appelée.
    Mais comment caster un pointeur sur instance (void*) en DWORD ?

    Si quelqu'un pouvait m'aider.

    D'avance merci.


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je dirais: Tu passes reinterpret_cast<DWORD_PTR>(this) en paramètre.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Effectivement il faut passer this à ton calback via le 4ème paramètre de ta fonction. Bizarre tout de même, normalement c'est du void* qui est utilisé dans ce genre de cas.

    Bref pour la conversion, il faut caster à la barbare avec reinterpret_cast. Voir la FAQ pour plus de détails sur les opérateurs de conversion.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    DWORD_PTR permet de passer n'importe quoi, en s'assurant de la compatibilité 64bits.

    Un DWORD_PTR est toujours assez grand pour contenir un DWORD, et assez grand pour contenir un pointeur.

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  2. Réponses: 3
    Dernier message: 16/05/2006, 18h22
  3. Réponses: 14
    Dernier message: 16/05/2006, 11h26
  4. Réponses: 4
    Dernier message: 01/12/2005, 12h33

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