我的 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 进行渲染