0 votes

convertir le callback des membres de la classe de __stdcall en DWORD_PTR

J'essaie d'utiliser un membre de classe comme callback mais le compilateur me donne l'erreur suivante :

Error 2 error C2440: 'type cast' : cannot convert from 'void (__stdcall CWaveIn::* )(HWAVEIN,UINT,DWORD_PTR,DWORD_PTR,DWORD_PTR)' to 'DWORD_PTR'

Est-il possible d'utiliser une fonction membre comme callback de cette manière ? Et comment convertir le pointeur de membre stdcall en DWORD_PTR demandé par la fonction winapi ?

class CWaveIn
{
private:
    void CALLBACK WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
};

void CWaveIn::Open() 
{
    (...)
    MMRESULT result = ::waveInOpen(&hWaveIn, currentInputDeviceId, waveFormat, (DWORD_PTR)CWaveIn::WaveInProc, 0, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT);
}

4voto

Christopher Points 6688

Vous ne pouvez pas passer directement dans les méthodes de classe.

C'est la bonne façon de faire :

class CWaveIn
{
private:
    static void CALLBACK staticWaveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
    {
        CWaveIn* pThis = reinterpret_cast<CWaveIn*>( dwParam1 );
        pThis->WaveInProc( ... );
    }
    void WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
    {
       // your code
    }
};

void CWaveIn::Open() 
{
     (...)
     MMRESULT result = ::waveInOpen(&hWaveIn, currentInputDeviceId, waveFormat, CWaveIn::staticWaveInProc, this, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT);
}

1voto

La solution générale, mais en aucun cas parfaite, consiste à rendre la fonction statique.

0voto

jalf Points 142628

Est-il possible d'utiliser une fonction membre comme callback de cette manière ?

Non. Ils ont des signatures différentes. Une fonction membre attend une signature implicite this en plus de ceux qui sont énumérés. Elle ne peut pas être appelée comme une fonction non membre.

et comment convertir le pointeur de membre stdcall en DWORD_PTR demandé par la fonction winapi ?

Tu ne peux pas. Vous devrez écrire une fonction d'enveloppe à utiliser comme rappel à la place. Il doit s'agir soit d'une fonction membre statique, soit d'une fonction non membre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X