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

时间:2011-11-25 07:24:42

标签: c++ winapi win32com win32gui

在我的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">时,它会要求我提供这些数据。

3 个答案:

答案 0 :(得分:4)

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

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

    < / LI>
  2. 通过IPersistentMoniker :: Load()通过自定义IMoniker提供html数据,并确保IMoniker :: GetDisplayName()(根据提供的html中的相对链接将被解析的基本URL)从协议方案(在我的例子中是“its://”)。这样,html数据中的相对链接“foo.png”将是://foo.png到IE,它将使urlmon调用IInternetProtocol :: Start()和IInternetProtocol :: Read()来请求该URL的数据

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

答案 1 :(得分:0)

您可以嵌入一个小型网络服务器,例如猫鼬,并从那里引用这些内容。

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

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

答案 2 :(得分:0)

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