我正在尝试使用类成员作为回调,但编译器给出了以下错误:
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);
}
答案 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?
你做不到。您将不得不编写一个包装函数来用作回调。它应该是静态成员函数或非成员函数。