none
IE9在OCX使用DirectX有时创建备份表面会失败 RRS feed

  • 问题

  • 我目前有个已经开发好的OCX控件,可以在IE6-IE7-IE8版本上正常运行显示视频监控图像

    到了IE9之后DirectX经常会出现创建备份表面失败的情况,提示错误代码是DDERR_NODIRECTDRAWHW

    这是DirectX初始化代码,就在最后那一个if语句出错,一旦出错后反复重试也是没用的

    尝试了很多,有两个现象:

    1、如果打开带有此OCX的网页前IE已经打开了某个网页的情况的话,问题肯定出现

    2、最后那个函数我改成DDSCAPS_SYSTEMMEMORY会成功,但在后续创建DDSCAPS_OFFSCREENPLAIN表面时如果是YUV表面也会失败,当然可以软件做一次YUV转换成RGB的动作也可以解决此问题,但这个转换会占用大量CPU,且效果很差(且目前显示图像以1080P为主,CPU本来也没什么剩余可以使用的了)

     if(FAILED(ddrval = DirectDrawCreateEx(NULL, (void**)&m_pDDraw,IID_IDirectDraw7, NULL)))
     {
      ASSERT(FALSE);
      return FALSE;
     } 
     if(FAILED(ddrval = m_pDDraw->SetCooperativeLevel(hwnd, DDSCL_NORMAL)))
     {
      ASSERT(FALSE);
      goto ERRORPRO;
     }
     INIT_DIRECTDRAW_STRUCT(ddsd);
     ddsd.dwFlags = DDSD_CAPS;
     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
     if(FAILED(ddrval = m_pDDraw->CreateSurface(&ddsd, &m_pPrimarySurf, NULL))) 
     {
      ASSERT(FALSE);
      goto ERRORPRO;
     }

     ddrval = m_pDDraw->CreateClipper(0, &m_pClipper, NULL);
     if(ddrval != DD_OK)
     {
      ASSERT(FALSE);
      goto ERRORPRO;
     }
     m_pClipper->SetHWnd(0, hwnd);
     if(FAILED(ddrval = m_pPrimarySurf->SetClipper(m_pClipper)))
     {
      ASSERT(FALSE);
      goto ERRORPRO;
     }

     INIT_DIRECTDRAW_STRUCT(ddsd);
     m_pDDraw->GetDisplayMode(&ddsd);

     ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
     ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
     ddrval = m_pDDraw->CreateSurface(&ddsd, &m_pBackSurf, NULL);
     if(FAILED(ddrval))
     {
      CString ss;
      ss.Format("0x%x",ddrval);
      AfxMessageBox(ss);
      goto ERRORPRO;
     }

    请高手指教


    2012年1月4日 7:26

全部回复

  • 发现新的规律就是,只要先打开了一个网页,如baidu,然后再打开含这个OCX的网页必然会失败,好像是网页占用了什么资源没释放导致的

    2012年1月4日 10:13
  • 得看网页吧。你开yahoo看看



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2012年1月4日 21:24
    版主
  • 打开yahoo后也会

    是否有可能和IE9会在某种情况下打开了Direct2D功能导致无法再正常使用DirectDraw,因为IE9听说使用了Direct2D技术

    2012年1月5日 1:42
  • 请各位高手帮帮忙

    2012年1月6日 3:05
  • 我曾经遇到过网页中存在alpha滤镜会导致创建表面失败。你检查一下网页中有没有滤镜效果

    2012年4月25日 3:21