VC6.0 发生异常 怎么解决 异常vc线程WaveOutAfxBeginThread 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个 wdmaud.drv 文件是微软 WDM Audio driver mapper 驱动程序。从你给出的截图来看,像是程序的收尾工作没有做好,导致程序崩溃。建议楼主贴出相关代码。 程序中使用了一个线程播放已经保存在list中的数据节点结构体是包含: nLen; \\ 音频数据长度 Data[640]; \\ 音频数据UINT PlaySoundProc(LPVOID lpParam){ HWAVEOUT hwo; WAVEHDR wh; WAVEFORMATEX wfx; CEvent wait; unsigned long frames = 0; unsigned long pos = 0; unsigned long playTimes = 0; int ret = 0 ; HI_U8 buf[1 << 16]; HI_U8 tempBuf[1 << 16]; memset(buf, 0, sizeof(buf)); memset(tempBuf, 0 ,sizeof(tempBuf)); wfx.cbSize = ((WAVEFORMATEX*)lpParam)->cbSize; wfx.nAvgBytesPerSec = ((WAVEFORMATEX*)lpParam)->nAvgBytesPerSec; wfx.nBlockAlign = ((WAVEFORMATEX*)lpParam)->nBlockAlign; wfx.nChannels = ((WAVEFORMATEX*)lpParam)->nChannels; wfx.nSamplesPerSec = ((WAVEFORMATEX*)lpParam)->nSamplesPerSec; wfx.wBitsPerSample = ((WAVEFORMATEX*)lpParam)->wBitsPerSample; wfx.wFormatTag = ((WAVEFORMATEX*)lpParam)->wFormatTag; ret = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (ULONG)(wait.m_hObject), 0L, CALLBACK_EVENT); BOOL bPlay = FALSE; list<G711u_FrameData>::iterator iter = g_lstFrameData.begin(); while ( !g_lstFrameData.empty()) { memcpy(tempBuf + pos, iter->Data, iter->nLen); pos += iter->nLen; frames ++; if ((pos + iter->nLen) > sizeof(tempBuf) || 1 == g_lstFrameData.size()) { // 播放一次数据 memcpy(buf, tempBuf, pos); wh.lpData = (LPSTR)buf; wh.dwBufferLength = pos; wh.dwFlags = 0L; wh.dwLoops = 1L; bPlay = TRUE; waveOutPrepareHeader(hwo, &wh, sizeof(WAVEHDR)); waveOutWrite(hwo, &wh, sizeof(WAVEHDR)); WaitForSingleObject(wait.m_hObject, INFINITE); playTimes ++; frames = 0; pos = 0; } // 删除list上头结点那一帧数据 g_lstFrameData.pop_front(); iter = g_lstFrameData.begin(); } if (bPlay) { waveOutUnprepareHeader(hwo, &wh,sizeof(WAVEHDR)); } waveOutClose(hwo); return 0;} 更新了系统声卡驱动之后提示的错误又变成查看问题详细信息展开后如下:问题签名: 问题事件名称: APPCRASH 应用程序名: testG711uPlayer.exe 应用程序版本: 1.0.0.1 应用程序时间戳: 534cfe54 故障模块名称: msvcrt.dll 故障模块版本: 7.0.7601.17744 故障模块时间戳: 4eeaf722 异常代码: c0000005 异常偏移: 00009b60 OS 版本: 6.1.7601.2.1.0.256.1 区域设置 ID: 2052 其他信息 1: 0a9e 其他信息 2: 0a9e372d3b4ad19135b953a78882e789 其他信息 3: 0a9e 其他信息 4: 0a9e372d3b4ad19135b953a78882e789联机阅读隐私声明: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804如果无法获取联机隐私声明,请脱机阅读我们的隐私声明: C:\Windows\system32\zh-CN\erofflps.txt c0000005 访问非法地址, vs打开异常c0000005捕捉 调试下 单步声音播放结束的时候, 出现问题的时候显示的调用堆栈是内核调用。堆栈上没有显示到API函数上。看不到错在调用错误的哪儿? 屏蔽了 waveOutWrite 和 WaitForSingleObject(wait.m_hObject, INFINITE); 两行程序没有发生异常,说明程序问题可能出在 wait 这个CEvent上,但是确实不知道咋回事儿,方便 QQ 指点一下吗 ? 我 QQ : 735425967 谢谢。 waveOutWrite 有没有错误处理.初步判断是这个函数执行失败, 而你没有判断就直接wait. 感谢 xiaohuh421 的 指导, 程序在结束时候使用那个waveOutClose之前没有使用 waveOutReset 。结束时候应该写成 if (bPlay) { waveOutUnprepareHeader(hwo, &wh, sizeof(WAVEHDR)); } waveOutReset(hwo); waveOutClose(hwo); return 0;} 怎样用mfc找到文件夹路径,并读取文件夹内所有图片 求助:按下不同按键可以显示不同的界面,但是会显示很多个相同的,怎么解决 菜鸟求助,vc6.0 ocx WebService访问服务器时出现“〖997〗-重叠 I/O 操作在进行中”错误 关于开发多层结构的数据库程序的几个问题? ~~~关于Picture控件里位图重画 非阻塞式套接字的接收(在线等待) VC调用matlab进行曲线拟合 MSChart折线图显示的问题 在安装MSDN后,如何在VFP、VC中通过在线帮助中直接调用MSDN VC操作Excel中msoOLEControlObject对象 为什么程序不停的响应WM_PAINT消息?
节点结构体是包含:
nLen; \\ 音频数据长度
Data[640]; \\ 音频数据
UINT PlaySoundProc(LPVOID lpParam)
{
HWAVEOUT hwo;
WAVEHDR wh;
WAVEFORMATEX wfx;
CEvent wait; unsigned long frames = 0;
unsigned long pos = 0;
unsigned long playTimes = 0; int ret = 0 ;
HI_U8 buf[1 << 16];
HI_U8 tempBuf[1 << 16]; memset(buf, 0, sizeof(buf));
memset(tempBuf, 0 ,sizeof(tempBuf));
wfx.cbSize = ((WAVEFORMATEX*)lpParam)->cbSize;
wfx.nAvgBytesPerSec = ((WAVEFORMATEX*)lpParam)->nAvgBytesPerSec;
wfx.nBlockAlign = ((WAVEFORMATEX*)lpParam)->nBlockAlign;
wfx.nChannels = ((WAVEFORMATEX*)lpParam)->nChannels;
wfx.nSamplesPerSec = ((WAVEFORMATEX*)lpParam)->nSamplesPerSec;
wfx.wBitsPerSample = ((WAVEFORMATEX*)lpParam)->wBitsPerSample;
wfx.wFormatTag = ((WAVEFORMATEX*)lpParam)->wFormatTag;
ret = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (ULONG)(wait.m_hObject), 0L, CALLBACK_EVENT); BOOL bPlay = FALSE;
list<G711u_FrameData>::iterator iter = g_lstFrameData.begin(); while ( !g_lstFrameData.empty())
{
memcpy(tempBuf + pos, iter->Data, iter->nLen);
pos += iter->nLen;
frames ++;
if ((pos + iter->nLen) > sizeof(tempBuf) || 1 == g_lstFrameData.size())
{
// 播放一次数据
memcpy(buf, tempBuf, pos);
wh.lpData = (LPSTR)buf;
wh.dwBufferLength = pos;
wh.dwFlags = 0L;
wh.dwLoops = 1L;
bPlay = TRUE;
waveOutPrepareHeader(hwo, &wh, sizeof(WAVEHDR));
waveOutWrite(hwo, &wh, sizeof(WAVEHDR));
WaitForSingleObject(wait.m_hObject, INFINITE);
playTimes ++;
frames = 0;
pos = 0;
}
// 删除list上头结点那一帧数据
g_lstFrameData.pop_front();
iter = g_lstFrameData.begin();
} if (bPlay)
{
waveOutUnprepareHeader(hwo, &wh,sizeof(WAVEHDR));
} waveOutClose(hwo);
return 0;
}
问题事件名称: APPCRASH
应用程序名: testG711uPlayer.exe
应用程序版本: 1.0.0.1
应用程序时间戳: 534cfe54
故障模块名称: msvcrt.dll
故障模块版本: 7.0.7601.17744
故障模块时间戳: 4eeaf722
异常代码: c0000005
异常偏移: 00009b60
OS 版本: 6.1.7601.2.1.0.256.1
区域设置 ID: 2052
其他信息 1: 0a9e
其他信息 2: 0a9e372d3b4ad19135b953a78882e789
其他信息 3: 0a9e
其他信息 4: 0a9e372d3b4ad19135b953a78882e789联机阅读隐私声明:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804如果无法获取联机隐私声明,请脱机阅读我们的隐私声明:
C:\Windows\system32\zh-CN\erofflps.txt
单步声音播放结束的时候, 出现问题的时候显示的调用堆栈是内核调用。堆栈上没有显示到API函数上。看不到错在调用错误的哪儿?
屏蔽了
waveOutWrite
和
WaitForSingleObject(wait.m_hObject, INFINITE);
两行程序没有发生异常,说明程序问题可能出在 wait 这个CEvent上,但是确实不知道咋回事儿,
方便 QQ 指点一下吗 ? 我 QQ : 735425967 谢谢。
初步判断是这个函数执行失败, 而你没有判断就直接wait.
if (bPlay)
{
waveOutUnprepareHeader(hwo, &wh, sizeof(WAVEHDR));
}
waveOutReset(hwo);
waveOutClose(hwo);
return 0;
}