我用EVC在WINCE的模拟器上写一个录音的程序,是这么调用waveInOpen函数的,waveInOpen(&hwi,WAVE_MAPPER, pwfx, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW);但是设备输入句柄hwi却是个无效值,在VC上却是有效值哪位大侠帮解释下原因啊?  还有第一次启动模拟器运行此程序时可以录音和播放的,但是再次录音时waveInOpen函数返回4说明资源已经被分配而这个函数waveInPrepareHeader(hwi, &hdr, sizeof(WAVEHDR));却返回5,说句柄无效这是为什么呀??哪位大侠来帮忙??
代码是这样的:
    m_dwChannels = 1;           // default to mono
    m_dwBitsPerSample = 8; // default to 16-bit samples
    m_dwSampleRate = 11025; // default to 11.025KHz sample rate
    m_dwDeviceId = WAVE_MAPPER; // capture from device 0

    pwfx=&wfx;    wfx.cbSize = 0;
    //语音文件格式结构块的设置
    //数据编码格式,一般为PCM格式,脉冲编码格式
    wfx.wFormatTag = WAVE_FORMAT_PCM;
//采样位大小WINDOWS提供8,16位
    wfx.wBitsPerSample = (WORD) m_dwBitsPerSample;
//采样率(每秒的样本数),数值有:11025,22050,44100
    wfx.nSamplesPerSec = m_dwSampleRate;
//声道数,数值可为1或2
    wfx.nChannels = (WORD) m_dwChannels;
//指定块对齐(单位字节), 块对齐是数据的最小单位
    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
//指定数据传输的平均速率(每秒的字节数)
    wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;

    // try to allocate the capture buffer
    m_pBuffer1 = new BYTE [INP_BUFFER_SIZE];
    m_pBuffer2 = new BYTE [INP_BUFFER_SIZE];
    ASSERT(m_pBuffer1!=NULL); 
    ASSERT(m_pBuffer2!=NULL); 
   
    //语音设备数据块是设置
    hdr.dwBufferLength = INP_BUFFER_SIZE;
    hdr.lpData = (char*) m_pBuffer1;
hdr.dwBytesRecorded = 0;
hdr.dwUser=0;
hdr.dwFlags=0;
hdr.dwLoops=1;
hdr.lpNext=NULL;
hdr.reserved=0; hdr1.dwBufferLength = INP_BUFFER_SIZE;
    hdr1.lpData = (char*) m_pBuffer2;
hdr1.dwBytesRecorded = 0;
hdr1.dwUser=0;
hdr1.dwFlags=0;
hdr1.dwLoops=1;
hdr1.lpNext=NULL;
hdr1.reserved=0;
//MMSYSERR_NOERROR
// open the wave capture device
    mr = waveInOpen(&hwi,WAVE_MAPPER, pwfx, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW);   if(MMSYSERR_NOERROR != mr && MMSYSERR_ALLOCATED != mr){MessageBox(L"waveInOpen failed");}

    mr = waveInPrepareHeader(hwi, &hdr, sizeof(WAVEHDR));    // submit the buffer for capture
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInPrepareHeader failed");}

mr = waveInPrepareHeader(hwi, &hdr1, sizeof(WAVEHDR));
    // submit the buffer for capture
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInPrepareHeader failed");}    mr = waveInAddBuffer(hwi, &hdr, sizeof(WAVEHDR));
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInAddBuffer failed");}

    mr = waveInStart(hwi);
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInStart failed");}