我在窗口中放一个按钮控件,单击一次按钮,就调用下面这个自定义的Play方法,此时可以正常播放一个声音,现在的问题是,当我非常快速的连续单击按钮,也就是说不等声音播放结束,就不断的重复调用这个Play方法播放同一个声音文件,就是弹出系统异常框,说某个地址的内存不可读,各位觉得问题出在哪里呢?
int CSounds::Play()
{
if(MMSYSERR_NOERROR != waveOutOpen(NULL,WAVE_MAPPER,(WAVEFORMATEX*)&pFormat,NULL,NULL,WAVE_FORMAT_QUERY))
{
return Close();
} if(MMSYSERR_NOERROR != waveOutOpen(&hWaveOut,WAVE_MAPPER, (WAVEFORMATEX*)&pFormat,
(DWORD)waveOutProc/*(DWORD)hP*/,(DWORD)this,CALLBACK_FUNCTION/*CALLBACK_WINDOW*/))
{
return Close();
}
WaveHead.lpData=(LPSTR)lpData;
WaveHead.dwBufferLength=DataSize;
WaveHead.dwFlags=0L;
WaveHead.dwLoops=0L;
if(MMSYSERR_NOERROR != waveOutPrepareHeader(hWaveOut,&WaveHead,sizeof(WAVEHDR)))
{
return Close();
} if(MMSYSERR_NOERROR != waveOutWrite(hWaveOut,&WaveHead,sizeof(WAVEHDR)))
{
return Close();
} return TRUE;
}
int CSounds::Play()
{
if(MMSYSERR_NOERROR != waveOutOpen(NULL,WAVE_MAPPER,(WAVEFORMATEX*)&pFormat,NULL,NULL,WAVE_FORMAT_QUERY))
{
return Close();
} if(MMSYSERR_NOERROR != waveOutOpen(&hWaveOut,WAVE_MAPPER, (WAVEFORMATEX*)&pFormat,
(DWORD)waveOutProc/*(DWORD)hP*/,(DWORD)this,CALLBACK_FUNCTION/*CALLBACK_WINDOW*/))
{
return Close();
}
WaveHead.lpData=(LPSTR)lpData;
WaveHead.dwBufferLength=DataSize;
WaveHead.dwFlags=0L;
WaveHead.dwLoops=0L;
if(MMSYSERR_NOERROR != waveOutPrepareHeader(hWaveOut,&WaveHead,sizeof(WAVEHDR)))
{
return Close();
} if(MMSYSERR_NOERROR != waveOutWrite(hWaveOut,&WaveHead,sizeof(WAVEHDR)))
{
return Close();
} return TRUE;
}
解决方案 »
- API HOOK
- MFC中想让程序在进程里休眠,除了sleep还有别的方法么?
- ListCtrl 中多余列问题
- 我的程序失败了,帮忙看看吧
- 如何对CList,CMap等进行排序?如果不可以,又怎样在VC的工程中使用STL?
- link成功后的错误!MailDlg.obj : error LNK2001: unresolved external symbol _RasGetProjectionInfoA@16.......
- 关于SendMessage()的参数调用问题,急!!!
- 新技术使全球软件网络化提速15年
- 十万火急,请问不用MFC,只用API可以调用出现文件夹浏览框吗?
- 请问位图背景的工具栏是怎样作的?(抱歉,没分了,今天)
- 华赛(华为和赛门铁克合资公司)招聘存储人才
- CSocket中的OnAccept的问题
在点击前对bool变量进行判断