0

我的 ActiveX 控件调用 IE9 的CreateSurfacePresenter来获得ISurfacePresenter接口。
我用它渲染到 IE9(或更高版本)浏览器暴露的 d3d 表面,
从而实现硬件加速的叠加混合。

一些代码:

CComQIPtr<IViewObjectPresentNotifySite, &IID_IViewObjectPresentNotifySite> m_spIViewObjectPresentSite;
ISurfacePresenter* m_spISurfacePresenter;

HRESULT hr = m_serviceProvider->QueryInterface(IID_IViewObjectPresentSite, (void **) &m_spIViewObjectPresentSite);
if(FAILED(hr))
  return -1;

// ... later...
m_numBuffers=1; // or 2 doesn't matter
hr = m_spIViewObjectPresentSite->CreateSurfacePresenter(
    m_partialScreenD3dDevice, window_width, window_height, m_numBuffers, DXGI_FORMAT_B8G8R8A8_UNORM, VIEW_OBJECT_ALPHA_MODE_IGNORE, &m_spISurfacePresenter);
// !!! this call works for activeX plugin hosted in IE9 browser, but fails (Invalid Argument)
// when hosted in a hosted IE webBrowser control (same html)

这适用于 IE9 浏览器。
但我需要它在嵌入式 IE ActiveX 控件中工作:
我将 IE9 WebBrowser 控件嵌入到 Windows 窗体或其他浏览器中,
并将 wb 控件导航到嵌入我的 ActiveX 控件的 html 页面。
但在这种情况下,对 CreateSurfacePresenter 的调用失败,并出现 Invalid Argument 错误。

为什么IE控件无法返回ISurfacePresenter?

注意:
1) IE WebBrowser 控件是一个有窗口的插件,而我的 ActiveX 是无窗口的。
2) 我验证了嵌入式 WebBrowser在 IE9 模式下加载(我从 JS 中读取了 UserAgent)
3) 我使用 direct3d9ex 进行渲染

4

1 回答 1

0

不幸的是,我没有找到原始问题的答案。
恐怕无法在嵌入式IE浏览器控件中使用这个界面。
但我发现在 Mozilla Gecko 中有一个类似的接口,称为 NPAPI AsyncDrawing
,它公开了一个可以绘制的 D3D10 表面,并且它可以在嵌入式 Gecko中工作。

于 2013-01-22T07:37:45.530 回答