【问题标题】:How to provide image data for embedded web control in C++如何在 C++ 中为嵌入式 Web 控件提供图像数据
【发布时间】:2012-01-06 03:27:12
【问题描述】:

在我的 C++ 应用程序中,我嵌入(通过 COM)网络浏览器 (Internet Explorer) 控件 (CLSID_WebBrowser)。

我可以使用 IHTMLDocument2::write() 方法在该控件中显示我自己的 html,但如果 html 包含 <img src="foo.png"> 元素,则不会显示。

我认为有办法以某种方式将 foo.png 的数据提供给 Web 控件,但我找不到合适的位置来挂钩此功能?

我需要完全控制提供 foo.png 的内容,因此使用 res:// 协议或保存到磁盘和使用 file:// 协议等变通方法还不够好。我只是想以某种方式插入我的代码,以便当嵌入式 CLSID_WebBrowser 控件在 IHTMLDocument2::write() 给出的 html 数据中看到 <img src="foo.png"> 时,它会要求我提供这些数据。

【问题讨论】:

    标签: c++ winapi win32com win32gui


    【解决方案1】:

    您可以嵌入一个小型网络服务器,例如 mongoose,并从那里引用这些图像。

    在猫鼬中,您可以将回调附加到特定路径,从而从 C++ 代码返回图像。

    我们将其用于调试工具,其中每个图像都可以从网络界面访问

    【讨论】:

    • 这是一种可能性,但我希望有一个更简单的解决方案,只涉及直接与 Web 控件交互。
    【解决方案2】:

    最简单的解决方案是Data URI。您可以直接使用IHTMLDocument2::write() 内联图像。

    【讨论】:

    • 这也是一种可能,但是html并不是我真正生成的,用现有html中的数据替换img链接并不简单
    【解决方案3】:

    为了回答我自己的问题,最终对我有用的解决方案是:

    1. 通过提供给 IInternetSession::RegisterNameSpace() 的自定义 IClassFactory 注册自定义 IInternetProtocol/IInternetProtocolInfo/。由于对我来说似乎是一个错误的原因,它必须是 IE 已知的协议(我选择了“它”),即使它是我自己的唯一命名空间会好得多。

    2. 通过自定义 IMoniker 通过 IPersistentMoniker::Load() 提供 html 数据,并确保 IMoniker::GetDisplayName()(这是一个基本 url,根据它提供的 html 中的相对链接将被解析)以该开头协议方案(在我的情况下为“它://”)。这样,html 数据中的相对链接“foo.png”将是它的://foo.png 到 IE,这将使 urlmon 调用 IInternetProtocol::Start() 和 IInternetProtocol::Read() 来询问该 url 的数据.

    这一切都相当复杂,您可以在此处查看实际的(BSD 许可)代码: http://code.google.com/p/sumatrapdf/source/browse/trunk/src/utils/HtmlWindow.cpp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2020-02-20
      相关资源
      最近更新 更多