首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于MFC下SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数调用失败的有关问题

2012-02-19 
关于MFC下SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数调用失败的问题我现在在做一个实现三维音效的程

关于MFC下SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数调用失败的问题
我现在在做一个实现三维音效的程序,是基于MFC的单文档框架,我只是在框架上增加了一个类Voice,用于播放声音和实现三维声效的。但是,在初始化directsound是调用SetCooperativeLevel(m_hwnd,DSSCL_PRIORITY)函数却失败了。我上网查了一下,觉得可能是m_hwnd传错了,因为开始我是在view中调用GetSafeHwnd()函数然后把它传递给m_hwnd的,后来我又试了一下,换为用App的句柄,也就是将AfxGetMainWnd()->GetSafeHwnd()传递给m_hwnd,结果还是一样。不知哪位高手能帮我解决一下这个问题?非常感激!

附注:
初始化directsound的代码如下:

C/C++ code
int Voice::InitPlayVoice(char* FileName){    result = DirectSoundCreate( NULL, &pDS, NULL );                //建立DirectSound对象    if(result != DS_OK)        AfxMessageBox("建立DirectSound对象失败!");    result = pDS->SetCooperativeLevel( m_hWnd, DSSCL_PRIORITY );   //设定协调层级    if(result != DS_OK)        AfxMessageBox("设定程序协调层级失败!");    memset( &dsdesc,0, sizeof(dsdesc) );                           //清空结构内容    dsdesc.dwSize        = sizeof(dsdesc);                         //配置描述结构大小    dsdesc.dwFlags       = DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;    dsdesc.dwBufferBytes = 0;    dsdesc.lpwfxFormat   = NULL;    result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );    if(result != DS_OK)        AfxMessageBox("建立主缓冲区失败!");    memset( &pwfmt,0, sizeof(pwfmt) );    pwfmt.wFormatTag      = WAVE_FORMAT_PCM;    pwfmt.nChannels       = 2;               //播放声道    pwfmt.nSamplesPerSec  = 44100;           //播放频率    pwfmt.wBitsPerSample  = 16;              //位    pwfmt.nBlockAlign     = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;    pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;    result = pPBuf->SetFormat(&pwfmt);       //设定播放格式    if(result != DS_OK)        AfxMessageBox("设定播放格式失败!");    result = pPBuf->QueryInterface( IID_IDirectSound3DListener,(VOID**)&Listener );    if(result != DS_OK)        AfxMessageBox("建立倾听者失败!");    pPBuf->Release();    hmmio = mmioOpen(FileName, NULL, MMIO_ALLOCBUF|MMIO_READ );        //打开文件    if(hmmio == NULL)                           //判断是否为空        AfxMessageBox("文件不存在");    ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');    //设定文件类型    mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);    //搜索类型    if(mmresult != MMSYSERR_NOERROR)        AfxMessageBox("文件格式错误!");    ckInfo.ckid = mmioFOURCC('f','m','t',' ');  //设定区块类型    mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);    //搜索区块    if(mmresult != MMSYSERR_NOERROR)        AfxMessageBox("文件格式错误!");    if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1)        AfxMessageBox("读取格式失败!");    mmresult = mmioAscend(hmmio,&ckInfo,0);     //跳出子区块    ckInfo.ckid = mmioFOURCC('d','a','t','a');  //设定区块类型    mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);    //搜索区块    if(mmresult != MMSYSERR_NOERROR)        AfxMessageBox("文件格式错误!");    size = ckInfo.cksize;                       //获得实际资料大小    memset( &dsdesc,0,sizeof(dsdesc));          //清空结构内容    dsdesc.dwSize  = sizeof(dsdesc);            //配置描述结构大小    dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS|DSBCAPS_CTRL3D;    dsdesc.dwBufferBytes = size;                dsdesc.lpwfxFormat   = &swfmt;              result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL );    if(result != DS_OK)        AfxMessageBox("建立次缓冲区失败!");    result = pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);    //锁定缓冲区    if(result != DS_OK)        AfxMessageBox("锁定缓冲区失败!");    mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);    //读取声音文件资料    if(mmresult == -1)        AfxMessageBox("读取声音文件资料失败!");    result = pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);    //解除锁定缓冲区    if(result != DS_OK)        AfxMessageBox("解除锁定缓冲区失败!");    mmioClose(hmmio,0);    result = pSBuf->QueryInterface( IID_IDirectSound3DBuffer,                                                   (VOID**)&Buffer3D );    if(result != DS_OK)        AfxMessageBox("建立3D缓冲区失败!");        // TODO: Add your specialized creation code here    return 0;} 



[解决办法]
跟踪调试一下,看看GetSafeHwnd()的返回值是否为NULL
[解决办法]
你把那个m_hWnd获取的那段程序也贴出来啊.感觉确实m_hWnd是错误的,也没有传进来.或者说实例还没有创建,你先初始化,那是否就是空的?看不到代码,我只能猜测.

热点排行