IMediaControl *pMC = NULL;
IVideoWindow  *pVW = NULL;
...
JIF(pGB->QueryInterface(IID_IMediaControl, (void **)&pMC));
JIF(pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW));//在这里没错
JIF(pVW->put_Owner((OAHWND)ghApp));//在这里就报一个框 如下
JIF(pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
FAILED(hr=0x80004002) in pVW->put_Owner(OAHWND)ghApp)
请各位看看 问题应该出在那?

解决方案 »

  1.   

    FAILED(hr=0x80004002) in pVW->put_Owner(OAHWND)ghApp) 
    这是全部的错误提示?
      

  2.   

    E_NOINTERFACE(0x80004002)
    没这样的接口ghApp的类型?
      

  3.   

    hr=0x80004002 不支持此接口 
    pVW->put_Owner(OAHWND)ghApp)//ghApp是窗口句柄吗??参数为窗口句柄 
      

  4.   

    在sdk的例子里边就是这个样子呀!我为什么不可以
    是!HWND      ghApp=0;是窗口句柄
      

  5.   

    代码有很多DirectShow SDK吗?有的话在里边有例子 你可以看一下 要不然就是把代码贴出来也调不了!
    要不给一个及时的联系方式 我的qq 349394761 msn:[email protected]
    各位大侠有什么想法随时告诉我!
      

  6.   

    在DirectShow SDK 的例子当中有全屏和字幕俩个例子 全屏的在DXSDK\Samples\C++\DirectShow\Players\PlayWndASFD;字幕在XSDK\Samples\C++\DirectShow\VMR9\Text 我想在字幕里边添加全屏功能 就卡到这里了!哎,各位大侠啊!帮帮忙吧!
      

  7.   

    1。确定你的Graph 已连接了render filter
    2。既然JIF(pVW->put_Owner((OAHWND)ghApp));这句出了问题,就不要使用定义的那个宏了,直接使用hr = pVW->put_Owner((OAHWND)ghApp)。看pVW值?看ghApp值?最后看hr值?估计要么是ghApp值不对,要么是未连接render filter
      

  8.   

    我相信楼主使用过不少sdk里的例子了。
    那,问个问题:
    为什么其它的例子没有出错,而这个例子却错了呢?我的结论是,楼主没找到关键点
      

  9.   

    嗯 这个方法我也用过了!不报错 但是没有效果出来 pvw也不是空值 hr的值我现在看去
    呵呵 不是这个例子出错了 是我添加了我的帖子里边的代码出的错!
      

  10.   


    HWND      ghApp=0;//在winmain里边创建的窗口 而且在没有添加我的代码的时候没错
    HMENU     ghMenu=0;
    HINSTANCE ghInst=0;
    TCHAR     g_szFileName[MAX_PATH]={0};
    DWORD     g_dwGraphRegister=0;
    RECT      g_rcDest={0};// DirectShow interfaces
    IGraphBuilder *pGB = NULL;
    IMediaControl *pMC = NULL;
    IMediaEventEx *pME = NULL;
    IMediaSeeking *pMS = NULL;
    IVMRWindowlessControl9 *pWC = NULL;
    IVideoWindow  *pVW = NULL; //这个是本人添加的 因为全屏要用到IVideoWindow  中的方法put_FullScreenModeHRESULT PlayMovieInWindow(LPTSTR szFile)
    {
        USES_CONVERSION;
        WCHAR wFile[MAX_PATH];
        HRESULT hr;    // Check input string
        if (szFile == NULL)
            return E_POINTER;    // Clear open dialog remnants before calling RenderFile()
        UpdateWindow(ghApp);    // Convert filename to wide character string
        wcsncpy(wFile, T2W(szFile), NUMELMS(wFile)-1);
        wFile[MAX_PATH-1] = 0;    // Get the interface for DirectShow's GraphBuilder
        JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                             IID_IGraphBuilder, (void **)&pGB));    if(SUCCEEDED(hr))
        {
            CComPtr <IBaseFilter> pVmr;        // Create the Video Mixing Renderer and add it to the graph
            JIF(InitializeWindowlessVMR(&pVmr));        // Render the file programmatically to use the VMR9 as renderer.
            // We pass a pointer to the VMR9 so that it will be used as the 
            // video renderer.  Pass TRUE to create an audio renderer also.
            if (FAILED(hr = RenderFileToVMR9(pGB, wFile, pVmr, TRUE)))
                return hr;        // QueryInterface for DirectShow interfaces
            JIF(pGB->QueryInterface(IID_IMediaControl, (void **)&pMC));
            JIF(pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME));
            JIF(pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS));
            JIF(pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW));//这个地方是我添加的 目的是取到pVW实例         //全屏需要对象,所以接下来这么做
             JIF(pVW->put_Owner((OAHWND)ghApp));
            JIF(pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));//按理说这样就应该能调用pVW中的方法了 但是就是不行!哎
            // Is this an audio-only file (no video component)?
            if (CheckVideoVisibility())
            {
                JIF(InitVideoWindow(1, 1));
            }
            else
            {
                // This sample requires a video clip to be loaded
                Msg(TEXT("This sample requires media with a video component.  ")
                    TEXT("Please select another file."));
                return E_FAIL;
            }        // Have the graph signal event via window callbacks for performance
            JIF(pME->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0));        // Select a text font if not already set
            if (!g_hFont)
                g_hFont = SetTextFont(FALSE);  // Don't display the Font Select dialog        // Add the dynamic text bitmap to the VMR's input
            // If the initial blend fails, post a close message to exit the app
            hr = BlendText(ghApp, g_szAppText);
            if (FAILED(hr))
                PostMessage(ghApp, WM_CLOSE, 0, 0);        // Complete the window setup
            ShowWindow(ghApp, SW_SHOWNORMAL);
            UpdateWindow(ghApp);
            SetForegroundWindow(ghApp);
            SetFocus(ghApp);#ifdef REGISTER_FILTERGRAPH
            if (FAILED(AddGraphToRot(pGB, &g_dwGraphRegister)))
            {
                Msg(TEXT("Failed to register filter graph with ROT!\0"));
                g_dwGraphRegister = 0;
            }
    #endif        // Run the graph to play the media file
            JIF(pMC->Run());        // Start the text update timer
            StartTimer();
        }    return hr;
    }
      

  11.   

    我上面的第一条难道没说清楚??请在使用put_Owner前确定连接了render filter!!!
      

  12.   

    sorry,看掉了,应该在RenderFileToVMR9里处理好了
      

  13.   

    楼主使用了vmr作为显示窗口,应该调用vmr的相关方法吧
      

  14.   

    如果您是说的输入输出pin是不是连接成功 那么例子里边是已经做好了的吧?要不然例子就不能运行了!
    如果不是这个的话,就是我没理解您的意思!菜鸟一个 请各位担待
      

  15.   

    在vmr的类中我没有发现可疑的方法...如果各位需要 请把邮箱贴出 我把这俩个例子发出!但有可能各位并没装SDK 可能缺库!
      

  16.   

    vmr肯定有全屏的方法试试IVMRWindowlessControl::SetVideoPositionVMR的全屏模式如何调出来?微软专家的回复没有奏效
      

  17.   


    谢谢您的回答!如果我帖子中的方法解决不了问题 那也只有按这种方法来做了!
    初步想法是: 在字幕的例子当中已经实现了响应窗口move或size的MoveVideoWindow 我直接创建屏幕大小的窗口 在上边播放
      

  18.   

    IID_IVideoWindow
    它query的是Video Render,不能控制vmr7或vmr9
      

  19.   

    VMR9应该用(IVMRWindowlessControl9*) m_Wc->SetVideoClippingWindow(m_hwndApp);
    来和窗口关联
      

  20.   

    我想的并不是用vmr来实现 是绘制窗口之后调用MoveVideoWindow()就是不知道可行性有多大
    我不是用想关联窗口 是为了用那个类中全屏功能所以不得以呀!
      

  21.   

    MoveVideoWindow后来操作当然可以 ,然后使用GetClientRect取得大小后设置给vmr9你在工程里查找GetClientRect这样的函数,看它是否使用
      

  22.   


    有用,在MoveVideoWindow就有这个函数的调用!
    可能是用IVideoWindow的时候有什么我没有注意
      

  23.   

    这个问题确实奇怪。只有在renderer是vmr9的时候。我这里才会出现。找了N多地方。也到 ms
     的论坛上发了消息来问。大多数人的回答都是上面的一样。既然例子行运行你不能那么你肯定错了。
    而且纠缠于hWndApp是不是错了之类的。
    我想详细的说一下。
    ms的例子中。能全屏的只有一个playwnd它并没有指定renderer是vmr9,其他例子中都不能全屏。还在说hWndApp不对或者楼主没有认真看代码的人请自己回去打嘴巴。 我把它的graph以调试的方式进行注册之后在graphedit里看到的是
    vmr7我在自己的程序中使用了windowless模式。文档上说。windowsless模式高效。那么我推断默认vmr9是windowless模式。需要指定窗口才行
    所以我推断vmr9 windowless已经不再支持IVideoWindow了