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]