关于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;
}