在C++中将回调函数转换为DWORD_PTR

use*_*131 2 c++ waveout

实际上是c ++中的新手.我写了这段代码,但说无法从"waveOutProc"转换为"DWORD_PTR".你能告诉我如何修复它吗?

谢谢

void CALLBACK Audio::waveOutProc(HWAVEOUT hWaveOut, unsigned int uMsg,
unsigned long dwInstance, unsigned long dwParam1,
unsigned long dwParam2)
{
/*
* pointer to free block counter
*/
int* freeBlockCounter = (int*)dwInstance;
/*
* ignore calls that occur due to openining and closing the
* device.
*/
if(uMsg != WOM_DONE) { return ; }
EnterCriticalSection(&waveCriticalSection) ;
(*freeBlockCounter)++ ;
LeaveCriticalSection(&waveCriticalSection) ;
}
Run Code Online (Sandbox Code Playgroud)

////////////////////////////////////////////////// ////////////////////////////////

void Audio::playSound(const char* filename)
{
HWAVEOUT hWaveOut ;
HANDLE hFile;
WAVEFORMATEX wfx ;
char buffer[1024];
int i;

...

if(waveOutOpen(
&hWaveOut,
WAVE_MAPPER,
&wfx,
(DWORD_PTR)waveOutProc,            ///////////Error Point
(DWORD_PTR)&waveFreeBlockCount,
CALLBACK_FUNCTION
) != MMSYSERR_NOERROR) {
fprintf(stderr, "unable to open wave mapper device\n");
ExitProcess(1);
}

...
}
Run Code Online (Sandbox Code Playgroud)

con*_*t3d 5

将函数指针转换为数据指针是一种未定义的行为,因此您不应该首先执行此操作.(我理解win api函数期待这个).

此外,除非处理隐式this参数,否则不能将成员函数作为C/C++中的回调传递.

您的目标回调具有以下签名

void CALLBACK waveOutProc(
  HWAVEOUT hwo,
  UINT uMsg,
  DWORD_PTR dwInstance,
  DWORD_PTR dwParam1,
  DWORD_PTR dwParam2
);
Run Code Online (Sandbox Code Playgroud)

虽然Audio :: waveOutProc可能是一个隐含此争论的成员函数.

void CALLBACK waveOutProc(Audio*,
      HWAVEOUT hwo,
      UINT uMsg,
      DWORD_PTR dwInstance,
      DWORD_PTR dwParam1,
      DWORD_PTR dwParam2
    );
Run Code Online (Sandbox Code Playgroud)

只需将其定义waveOutProc为静态或自由函数即可.