7

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

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

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

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

4

3 回答 3

5

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

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

  2. 通过 IPersistentMoniker::Load() 通过自定义 IMoniker 提供 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

于 2011-11-30T11:46:11.060 回答
0

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

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

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

于 2011-11-25T08:16:22.273 回答
0

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

于 2011-11-25T09:54:36.970 回答