将类成员回调从__stdcall转换为DWORD_PTR

时间:2010-01-03 13:05:23

标签: c++ winapi audio

我正在尝试使用类成员作为回调,但编译器给出了以下错误:

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

是否可以通过这种方式使用成员函数作为回调?以及如何将stdcall成员指针转换为winapi函数请求的DWORD_PTR?

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);
}

3 个答案:

答案 0 :(得分:4)

您不能直接传递类方法。

这是正确的方法:

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);
}

答案 1 :(得分:1)

一般而言,虽然绝不是完美的解决方案,但是要使函数保持静态。

答案 2 :(得分:0)

  

是否可以通过这种方式将成员函数用作回调?

没有。他们有不同的签名。除了列出的参数之外,成员函数还需要隐式this参数。它不能被称为非成员函数。

  

如何将stdcall成员指针转换为winapi函数请求的DWORD_PTR?

你做不到。您将不得不编写一个包装函数来用作回调。它应该是静态成员函数或非成员函数。