2

背景:

我正在创建一个 IWebBrowser2 并导航到一个 URL。这是代码的简短版本:

IWebBrowser2* pWebBrowser = NULL;
hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void **)&pWebBrowser);
hr = pWebBrowser->Navigate(bstrURL, &varFlags, &varEmptyStr, &varEmptyStr, &varEmptyStr);
hr = pWebBrowser->put_Visible(VARIANT_TRUE);
// Get the handle of the IE window 
HWND handle = NULL;
hr = pWebBrowser->get_HWND((long*)&handle); // this could be done better with reinterpret_cast
…

问题:

有时,对 get_HWND 的调用会失败并显示 0x80004005 错误代码。它仅在某些工作站上失败。

问题:

  1. 为什么调用 get_HWND 随机失败?
  2. get_HWND 的使用是否正确完成?预期的类型是 SHANDLE_PTR。

一些可能有用的链接:

http://msdn.microsoft.com/en-us/library/aa752126%28v=vs.85%29.aspx http://codecentrix.blogspot.com/2007/11/when-iwebbrowser2gethwnd-returns-efail.html

需要更多信息?让我知道

谢谢!

4

1 回答 1

1

对get_HWND的调用很好,它随机失败,因为实例被杀死。为什么?

使用CLSID_InternetExplorer调用CoCreateInstance将实例化具有低完整性级别的进程。如果您导航到的 URL 绑定到低完整性级别(对于 Internet 站点来说是这样),则不会有问题。另一方面,如果您导航到一个绑定到中等完整性级别的 URL(对于 Intranet/受信任的站点是如此),那么您的进程将被终止并创建一个具有中等完整性级别的新进程(在 IE8 及更高版本中无缝)。此操作称为“虚拟标签切换”。</p>

有关该问题及其解决方法的更多信息:

http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/internet-explorer-automation-protected-mode-lcie-default-integrity-level-medium.aspx

http://msdn.microsoft.com/en-us/library/aa752084%28v=vs.85%29.aspx

Windows Internet Explorer 8。在 Windows Vista 上,要创建以中等完整性级别运行的 Internet Explorer 实例,请将 CLSID_InternetExplorerMedium(在 exdisp.idl 中定义)传递给 CoCreateInstance。生成的 InternetExplorerMedium 对象支持与 InternetExplorer 对象相同的事件、方法和属性。

您可能想验证这确实是您面临的问题。以下是如何运行快速测试:

  1. 打开 IE
  2. 前往设置
  3. 安全选项卡
  4. 本地内网
  5. 单击“站点”按钮
  6. 取消勾选“自动检测内网网络”</li>

那应该抑制虚拟标签开关

测试 IE 完整性级别

这是关于保护模式的附加信息(取自 Matthew Crowley 的 Pro Internet Explorer 8 & 9 Development: Developing Powerful Applications for the Next Generation of IE):

Windows Vista 引入了 MIC 的概念,它使用完整性级别 (IL) 通过信任和特权级别来区分文件系统对象、注册表位置和 API,并使用用户帐户控制 (UAC) 来将提升请求汇集到用户。这种架构有助于保护系统和用户文件免受不受信任的应用程序的恶意访问。

Windows Vista 及更高版本上的完整性级别分为四大类:

系统:核心操作系统(NTAUTHORITY);系统组件、文件和数据

:机器级访问(管理员);程序文件和本地机器注册表配置单元

:用户级访问(用户);用户文件和设置以及当前用户注册表配置单元

:不受信任的内容、临时文件和数据

于 2015-01-09T19:27:44.873 回答