出错信息为:
Unhandled exception in Recorder.exe(WDMAUD.DRV): 0xC00000005: Access Violation.胸闷呀.

解决方案 »

  1.   

    能不能看看你MM_WIM_DATA的响应函数的代码? 还有你声卡以什么方式打开的?
      

  2.   

    打开方式:
    mmReturn = ::waveInOpen( &m_hRecord, AudioDeviceID, &m_Format,(DWORD) hWndGlobal, NULL, CALLBACK_WINDOW  ); //use on message to map.....函数代码.
    void CRecorderDlg::OnMM_WIM_DATA(UINT parm1, LONG parm2)
    {
    MMRESULT mmReturn = 0;

    LPWAVEHDR pHdr = (LPWAVEHDR) parm2; mmReturn = ::waveInUnprepareHeader(m_hRecord, pHdr, sizeof(WAVEHDR));
    if(mmReturn)
    {
    // waveInErrorMsg(mmReturn, "in OnWIM_DATA()");
    return;
    } TRACE("WIM_DATA %4d\n", pHdr->dwBytesRecorded);

    // if (recordstate) 
    {
    CBuffer buf(pHdr->lpData, pHdr->dwBufferLength);

    // if (!recordpaused) 
    { //write only if not paused

    //Write Data to file
    DataFromSoundIn(&buf); } // reuse the buffer:
    // prepare it again
    mmReturn = ::waveInPrepareHeader(m_hRecord,pHdr, sizeof(WAVEHDR));
    if(mmReturn)
    {
    // waveInErrorMsg(mmReturn, "in OnWIM_DATA()");
    }
    else // no error
    {
    // add the input buffer to the queue again
    mmReturn = ::waveInAddBuffer(m_hRecord, pHdr, sizeof(WAVEHDR));
    // if(mmReturn) waveInErrorMsg(mmReturn, "in OnWIM_DATA()");
    // else return;  // no error
    }

    } // we are closing the waveIn handle, 
    // all data must be deleted
    // this buffer was allocated in Start()
    delete pHdr->lpData;
    delete pHdr;
    m_QueuedBuffers--;

    }
      

  3.   

    楼主,waveInUnprepareHeader()这个函数,在关闭设备前使用一次.waveInPrepareHeader(),在打开设备前使用一次.这样就可以了.在OnMM_WIM_DATA()里面,你把他们去掉就应该没有问题了.试试吧,如过还有问题,write mail to me:[email protected]
      

  4.   

    对不起,打错了一个字,waveInPrepareHeader(),在打开设备"后"(不是"前")使用一次,就可以了.
      

  5.   

    我做录音程序的时候,也做法和楼主类似,在这个OnMM_WIM_DATA()里面使用waveInPrepareHeader(),waveInUnprepareHeader().因为如MSDN所述:This function cleans up the preparation performed by waveInPrepareHeader. The function must be called after the device driver fills a data buffer and returns it to the application. You must call this function before freeing the data buffer.但出现同样问题.我采取的方法如上所述,解决了问题.楼主可以试试.
    为什么我不是很清楚.我认为,重要的是You must call this function before freeing the data buffer.
      

  6.   

    楼主,我仔细看了,并且测试了你的OnMM_WIM_DATA(),你把"delete pHdr->lpData;delete pHdr;"去掉,很可能就可以了.至少,在我的机子上可以.
      

  7.   

    对了,我只测试了你关于录音的部分.对于另外的部分,如下,我无法测试.就是说除了下面的.其他部分可以了,但要把"delete pHdr->lpData;delete pHdr;"去掉.
    CBuffer buf(pHdr->lpData, pHdr->dwBufferLength);

    // if (!recordpaused) 
    { //write only if not paused

    //Write Data to file
    DataFromSoundIn(&buf); }