如何在c++中为嵌入式web控件提供图像数据

How to provide image data for embedded web control in C++

本文关键字:控件 图像 数据 web 嵌入式 c++      更新时间:2023-10-16

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

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

我假设有一种方法让我以某种方式为web控件提供foo.png的数据,但我找不到合适的地方来挂钩这个功能?

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

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

  1. register custom IInternetProtocol/IInternetProtocolInfo/via custom IClassFactory给IInternetSession::RegisterNameSpace()。由于对我来说似乎是一个bug的原因,它必须是IE已经知道的协议(我选择了"its"),即使它是我自己的,唯一的命名空间会更好。

  2. 通过IPersistentMoniker::Load()通过自定义IMoniker提供html数据,并确保IMoniker::GetDisplayName()(这是一个基础url,根据提供的html中的相对链接将被解析)以该协议方案开始(在我的情况下"its://")。这样,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

你可以嵌入一个小的web服务器,如mongoose,并从那里引用这些图片。

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

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

访问。

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