void CNewAviTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
IGraphBuilder   *m_pGraph;   
    IMediaControl   *m_pControl;   
    IMediaEventEx     *m_pEvent;  
IVideoWindow  *m_pVideoWindow;
    CoInitialize(NULL);   HWND   hWnd; 
hWnd = GetDlgItem(IDC_STATIC_MPEG)->m_hWnd;  HRESULT hr;     //free(); //Deletes any previous DirectShow instances 
    hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraph); 
    if (!SUCCEEDED(hr)) 

MessageBox(_T("CoCreateInstance failed")); 

    hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl); 
    if (!SUCCEEDED(hr)) 

MessageBox(_T("IID_IMediaControl failed")); 

    hr = m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent); 
    if (!SUCCEEDED(hr)) 

MessageBox(_T("IID_IMediaEventEx failed"));  
}     hr = m_pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0); 
    if (!SUCCEEDED(hr)) 

MessageBox(_T("SetNotifyWindow  failed")); 

    hr = m_pGraph->RenderFile(_T("C\\爱我别走.avi"), NULL); 
    if (!SUCCEEDED(hr)) 

MessageBox(_T("RenderFile  failed")); 
        //m_pMediaPlayerLog->WriteOut("RenderFile  failed,RESULT:0x%x",hr); 

    hr = m_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVideoWindow); 
    if (!SUCCEEDED(hr)) 

MessageBox(_T("IID_IVideoWindow  failed")); 
    }  SetWindowLong(hWnd,GWL_STYLE,GetWindowStyle(hWnd) |WS_CLIPCHILDREN);
    hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);// 这里报错
    if (!SUCCEEDED(hr)) 

   MessageBox(_T("put_Owner failed"));
     } 
    hr = m_pVideoWindow->put_WindowStyle(WS_CHILD  |WS_CLIPCHILDREN  |WS_CLIPSIBLINGS); //然后这里也会报错
     if (!SUCCEEDED(hr)) 
 { 
 MessageBox(_T("put_WindowStyle  failed"));
         //m_pMediaPlayerLog->WriteOut("put_WindowStyle  failed,RESULT:0x%x",hr); 
 } 
     hr = m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);//然后这里也会报错
     if (!SUCCEEDED(hr)) 
 { 
 MessageBox(_T("put_MessageDrain  failed"));
     //m_pMediaPlayerLog->WriteOut("put_MessageDrain  failed,RESULT:0x%x",hr); 
 } 
     hr = m_pVideoWindow->put_Visible(OATRUE); //最后是这里也会报错
     if (!SUCCEEDED(hr)) 
 { 
 MessageBox(_T("put_Visible  failed"));
     //m_pMediaPlayerLog->WriteOut("put_Visible  failed,RESULT:0x%x",hr); 
 }      RECT grc; 
     GetClientRect(&grc); 
     m_pVideoWindow->SetWindowPosition(289,81,704,585); 
     m_pVideoWindow->put_Visible(OATRUE);   m_pControl->Run();  }
    哪位大侠能告诉我,我的m_pVideoWindow->put_Owner((OAHWND)hWnd),
                           m_pVideoWindow->put_WindowStyle(WS_CHILD  |WS_CLIPCHILDREN  |WS_CLIPSIBLINGS);
                       m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);
                       m_pVideoWindow->put_Visible(OATRUE); 
                    都错在哪里?谢谢!!!

解决方案 »

  1.   

    我把出错的地方代码改成了输出错误代码信息了,如: 
    hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);//  
        if (!SUCCEEDED(hr))  
    {  
       strError.Format(_T("put_Owner出错:%d"),GetLastError());  
       MessageBox(strError); 
         }  
        hr = m_pVideoWindow->put_WindowStyle(WS_CHILD   ¦WS_CLIPCHILDREN   ¦WS_CLIPSIBLINGS);  
         if (!SUCCEEDED(hr))  
     {  
     //MessageBox(_T("put_WindowStyle  failed")); 
     strError.Format(_T("put_WindowStyle出错:%d"),GetLastError());  
         MessageBox(strError); 
     }  
         hr = m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);//将所有消息传给父窗体处理  
         if (!SUCCEEDED(hr))  
     {  
     //MessageBox(_T("put_MessageDrain  failed")); 
             strError.Format(_T("put_MessageDrain出错:%d"),GetLastError());  
         MessageBox(strError);  
     }  
         hr = m_pVideoWindow->put_Visible(OATRUE);  
         if (!SUCCEEDED(hr))  
     {  
     //MessageBox(_T("put_Visible  failed")); 
             strError.Format(_T("put_Visible出错:%d"),GetLastError());  
         MessageBox(strError);  
     }       RECT grc;  
         GetClientRect(&grc);  
         m_pVideoWindow->SetWindowPosition(289,81,704,585);  
         m_pVideoWindow->put_Visible(OATRUE);       m_pControl->Run(); 输出的错误信息为: 
    put_Owner出错: 0 
    put_WindowStyle出错: 6 
    put_MessageDrain出错:6 
    put_Visible出错: 6 
    希望知道的大侠多多指教,非常感谢!谢谢!!! 
      

  2.   

    void CNewAviTestDlg::OnButton1()     
    {    
    // TODO: Add your control notification handler code here    
    IGraphBuilder   *m_pGraph;       
        IMediaControl   *m_pControl;       
        IMediaEventEx     *m_pEvent;      
    IVideoWindow  *m_pVideoWindow;    
        CoInitialize(NULL);      HWND   hWnd =   GetSafeHwnd();         HRESULT hr;         //free(); //Deletes any previous DirectShow instances     
        hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraph);     
        if (!SUCCEEDED(hr))     
    {     
    MessageBox(_T("CoCreateInstance failed"));     
    }     
        hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl);     
        if (!SUCCEEDED(hr))     
    {     
    MessageBox(_T("IID_IMediaControl failed"));     
    }     
        hr = m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);     
        if (!SUCCEEDED(hr))     
    {     
    MessageBox(_T("IID_IMediaEventEx failed"));      
    }         hr = m_pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0);     
        if (!SUCCEEDED(hr))     
    {     
    MessageBox(_T("SetNotifyWindow  failed"));     
    }     
        hr = m_pGraph->RenderFile(_T("C\\爱我别走.avi"), NULL);     
        if (!SUCCEEDED(hr))     
    {     
    MessageBox(_T("RenderFile  failed"));     
            //m_pMediaPlayerLog->WriteOut("RenderFile  failed,RESULT:0x%x",hr);     
    }     
        hr = m_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVideoWindow);     
        if (!SUCCEEDED(hr))     
    {     
    MessageBox(_T("IID_IVideoWindow  failed"));     
        }     SetWindowLong(hWnd,GWL_STYLE,GetWindowStyle(hWnd)  ¦WS_CLIPCHILDREN);    
        hr = pVidWin->put_Owner((OAHWND)hwnd);   
        CString strError;   
        if (!SUCCEEDED(hr))    
         {    
           strError.Format(_T("put_Owner出错:%x"),hr);   //这里开始报错!!! 
           MessageBox(strError);   
           strError.Format(_T("put_Owner出错:%d"),hr);    
           MessageBox(strError);   
           strError.Format(hr);   
           MessageBox(strError);   
         }    
        hr = m_pVideoWindow->put_WindowStyle(WS_CHILD   ¦WS_CLIPCHILDREN   ¦WS_CLIPSIBLINGS); //然后这里也会报错 ,失败了   
         if (!SUCCEEDED(hr))     
     {     
     MessageBox(_T("put_WindowStyle  failed"));    
             //m_pMediaPlayerLog->WriteOut("put_WindowStyle  failed,RESULT:0x%x",hr);     
     }     
         hr = m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);//然后这里也会报错 ,失败了   
         if (!SUCCEEDED(hr))     
     {     
     MessageBox(_T("put_MessageDrain  failed"));    
         //m_pMediaPlayerLog->WriteOut("put_MessageDrain  failed,RESULT:0x%x",hr);     
     }     
         hr = m_pVideoWindow->put_Visible(OATRUE); //最后是这里也会报错 ,失败了   
         if (!SUCCEEDED(hr))     
     {     
     MessageBox(_T("put_Visible  failed"));    
         //m_pMediaPlayerLog->WriteOut("put_Visible  failed,RESULT:0x%x",hr);     
     }          RECT grc;     
         GetClientRect(&grc);     
         m_pVideoWindow->SetWindowPosition(289,81,704,585);     
         m_pVideoWindow->put_Visible(OATRUE);      m_pControl->Run();     }    
    察看输出结果:  
    第一个对话框显示:put_Owner出错:80004002  
    第二个对话框显示:put_Owner出错:-2147467262  
    第三个对话框是空白  我想创建一个视频窗口,播放MP4。谁能告诉我put_Owner()里面的参数应该怎么得到才不会出现那样的错误阿?谢谢大家!   
      

  3.   

    你第一次贴的代码是因为
    m_pVideoWindow ,没有赋值(QueryInterface(....,&m_pVideoWindow);
    所以错了到了3楼貌似对了,在我机器上没有问题
    ,不过我把
    hr = m_pGraph->RenderFile(_T("C\\爱我别走.avi"), NULL);    
    改成了
    hr = m_pGraph->RenderFile(L"C\\爱我别走.avi", NULL);    
      

  4.   

    To ZaiJianBa:
    谢谢,总算有人回我了。
    可是我不知道你为什么可以用。而在我的机器上显示:
    put_Owner出错: 0 
    put_WindowStyle出错: 6 
    put_MessageDrain出错:6 
    put_Visible出错: 6 
    天啊!为什么啊?难道是我的板子有问题?谁能帮忙指点一下啊?
      

  5.   

    put_Owner出错: 0  
    put_WindowStyle出错: 6  
    put_MessageDrain出错:6  
    put_Visible出错: 6  
    是用一楼的代码产生的,“put_Owner出错: 0 ”说明没有错误。可是还是没有图像,说明还是有错误。其实最关键的应该还是三楼代码的错误信息:
    第一个对话框显示:put_Owner出错:80004002   
    第二个对话框显示:put_Owner出错:-2147467262   
    第三个对话框是空白   
    接着就是几声“咔”,没有图像。不知道为什么。
      

  6.   

    三楼的代码中:
     hr = pVidWin->put_Owner((OAHWND)hwnd);    
    //我想你这里是不是贴错了,pVidWin哪来的,应该是m_pVideoWindow 吧把 
    hr = m_pGraph->RenderFile(_T("C\\爱我别走.avi"), NULL);     
    改成 
    hr = m_pGraph->RenderFile(L"C\\爱我别走.avi", NULL); 
       
    还有,把m_pVideoWindow->SetWindowPosition(289,81,704,585); 这句也注释掉试试另外HWND   hWnd =   GetSafeHwnd();获得的句柄是整个对话框的,注意显示的时候不要把其它按钮覆盖住
         
      

  7.   

    To ZaiJianBa:
       不好意思,三楼的代码是应该是hr = m_pVideoWindow->put_Owner((OAHWND)hwnd); 
       我现在把hr = m_pGraph->RenderFile(_T("C\\爱我别走.avi"), NULL); 改成 hr = m_pGraph->RenderFile(L"C\\爱我别走.avi", NULL);了
              把m_pVideoWindow->SetWindowPosition(289,81,704,585); 这句也注释掉了。
       至于,HWND  hWnd =  GetSafeHwnd();获得的句柄是整个对话框的,对于目前的我来说最重要的是把图像放出来,会不会把其他按钮覆盖掉以后再考虑吧。目前的我还是先把图像放出来再说。
        可现在的结果还是还是接着就是几声“咔”,没有图像。
      

  8.   

    这是我现在的代码:
      void CNewAviTestDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here IGraphBuilder   *m_pGraph;   
        IMediaControl   *m_pControl;   
        IMediaEventEx     *m_pEvent;  
    IVideoWindow  *m_pVideoWindow;
        CoInitialize(NULL);   HWND   hWnd; 
    hWnd = GetDlgItem(IDC_STATIC_MPEG)->m_hWnd;  HRESULT hr; 
    CString strError;    //free(); //Deletes any previous DirectShow instances 
        hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraph); 
        if (!SUCCEEDED(hr)) 

    MessageBox(_T("CoCreateInstance failed")); 

        hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl); 
        if (!SUCCEEDED(hr)) 

    MessageBox(_T("IID_IMediaControl failed")); 

        hr = m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent); 
        if (!SUCCEEDED(hr)) 

    MessageBox(_T("IID_IMediaEventEx failed"));  
    }     hr = m_pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0); 
        if (!SUCCEEDED(hr)) 

    MessageBox(_T("SetNotifyWindow  failed")); 

        hr = m_pGraph->RenderFile(L"C\\这就是爱.avi", NULL); 
        if (!SUCCEEDED(hr)) 

    MessageBox(_T("RenderFile  failed")); 
            //m_pMediaPlayerLog->WriteOut("RenderFile  failed,RESULT:0x%x",hr); 

        hr = m_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVideoWindow); 
        if (!SUCCEEDED(hr)) 

    MessageBox(_T("IID_IVideoWindow  failed")); 
        } /* SetWindowLong(hWnd,GWL_STYLE,GetWindowStyle(hWnd) |WS_CLIPCHILDREN);    hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);// 
        if (!SUCCEEDED(hr)) 

       strError.Format(_T("put_Owner出错:%d"),GetLastError()); 
       MessageBox(strError);
         } */

        SetWindowLong(hWnd,GWL_STYLE,GetWindowStyle(hWnd)  |WS_CLIPCHILDREN);     
        hr = m_pVideoWindow->put_Owner((OAHWND)hWnd);    
           
        if (!SUCCEEDED(hr))     
         {     
           strError.Format(_T("put_Owner出错:%x"),hr);   //这里开始报错!!!  
           MessageBox(strError);    
           strError.Format(_T("put_Owner出错:%d"),hr);     
           MessageBox(strError);    
           strError.Format(hr);    
           MessageBox(strError);    
         }         hr = m_pVideoWindow->put_WindowStyle(WS_CHILD  |WS_CLIPCHILDREN  |WS_CLIPSIBLINGS); 
         if (!SUCCEEDED(hr)) 
     { 
     //MessageBox(_T("put_WindowStyle  failed"));  strError.Format(_T("put_WindowStyle出错:%d"),GetLastError()); 
         MessageBox(strError);
     } 
         hr = m_pVideoWindow->put_MessageDrain((OAHWND)hWnd);//将所有消息传给父窗体处理 
         if (!SUCCEEDED(hr)) 
     { 
     //MessageBox(_T("put_MessageDrain  failed"));
             strError.Format(_T("put_MessageDrain出错:%d"),GetLastError()); 
         MessageBox(strError); 
     } 
         hr = m_pVideoWindow->put_Visible(OATRUE); 
         if (!SUCCEEDED(hr)) 
     { 
     //MessageBox(_T("put_Visible  failed"));
             strError.Format(_T("put_Visible出错:%d"),GetLastError()); 
         MessageBox(strError); 
     }      RECT grc; 
         GetClientRect(&grc); 
        // m_pVideoWindow->SetWindowPosition(289,81,704,585); 
         m_pVideoWindow->put_Visible(OATRUE);   m_pControl->Run(); }现在的错误:
        第一个对话框显示:put_Owner出错:80004002    
        第二个对话框显示:put_Owner出错:-2147467262    
        第三个对话框是空白    
    接下去:
        put_WindowStyle出错: 6  
       put_MessageDrain出错:6  
       put_Visible出错: 6  
    请知道会做的大侠帮帮忙!谢谢!
      

  9.   

    在上面的代码中:
    HWND   hWnd;  
    hWnd = GetDlgItem(IDC_STATIC_MPEG)->m_hWnd;  //IDC_STATIC_MPEG是我在对话框上的一个PictureBox控件的ID
    我用HWND hWnd = GetSafeHwnd();  将它代替,用当前整个对话框作为句柄结果也一样没有图像,只有“咔”几声。
    请各位大侠多帮帮忙!小弟感激不尽!!!
      

  10.   

    这我也不知道了,我这里可以运行成功
    C\\爱我别走.avi ====》C:\\爱我别走.avi
      

  11.   

    To ZaiJianBa:
       不行的,我改成C:\\爱我别走.avi之后就显示“RenderFile  failed”了。说明路径不对。
        请问,你确定你那里可以播放,而且有图像的吗?
       谢谢!!!
      

  12.   

    C\\爱我别走.avi 这样肯定是错的
    我的机器在C盘下当然没有这个文件了,我用自己别的盘的文件代替,可以运行。
    提示"RenderFile  failed" 倒是好事,可能是你的系统本身没有支持播放该文件的解码器,
    你可以试着用这个文件拖到graphedt.exe里看看效果。
      

  13.   

    To ZaiJianBa:
      可是我用“HBITMAP hbitmap=(HBITMAP)SHLoadDIBitmap(_T("C\\Maps\\MAP.bmp"));”载入图片,或者播放MP3的时候“pGraph->RenderFile(_T("C\\不要说爱我.mp3"), NULL); ”路径都是这么写的,都对的。所以路径应该是对的。希望高手再指点一下,到底是哪里的问题。谢谢!!!