Passer un pointeur sur une instance à une fonction membre static ? [Résolu]

Signaler
Messages postés
122
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
22 juillet 2006
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
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 les fonctions midi de Windows


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 tard 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é 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.

Tintin 72

1 réponse

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
(DWORD)this
ou
(DWORD_PTR)this
ou
(ULONG_PTR)this

selon les cas (les 2 dernières permettent une compatibilité 64 bits)

this est le pointeur à passer en paramètre aux callback