【问题标题】:Failed to get the handle of the Windows Internet Explorer main window获取 Windows Internet Explorer 主窗口句柄失败
【发布时间】:2015-02-17 21:59:11
【问题描述】:

背景:

我正在创建一个 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

需要更多信息?让我知道

谢谢!

【问题讨论】:

  • 0x80004005 是“拒绝访问”。您使用 get_HWND 没有问题。您的程序与故障工作站的安全注意事项有关。
  • @manuell 据我所知,0x80004005 是“未指定的错误”。来源:msdn.microsoft.com/en-us/library/cc704587.aspx
  • 你是对的。对不起。如果你提前调用 get_HWND 会发生什么?

标签: windows internet-explorer visual-c++ com window-handles


【解决方案1】:

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

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

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

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 中定义)到 共同创建实例。生成的 InternetExplorerMedium 对象支持 与 InternetExplorer 相同的事件、方法和属性 对象。

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

  1. 打开 IE
  2. 进入设置
  3. 安全标签
  4. 本地内网
  5. 点击“网站”按钮
  6. 取消选中“自动检测 Intranet 网络”

这应该抑制虚拟选项卡开关

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2013-11-11
    • 2020-04-13
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多