gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:37:13 26 4
gpt4 key购买 nike

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

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

我假设我有办法以某种方式向 Web 控件提供 foo.png 的数据,但我找不到正确的位置来 Hook 此功能?

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

最佳答案

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

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

  2. 通过 IPersistentMoniker::Load() 通过自定义 IMoniker 提供 html 数据,并确保 IMoniker::GetDisplayName()(这是一个基本 url,所提供的 html 中的相关链接将根据该 url 进行解析)以此开头协议(protocol)方案(在我的例子中是“its://”)。这样,html 数据中的相对链接“foo.png”将是 its://foo.png 到 IE,这将使 urlmon 调用 IInternetProtocol::Start() 和 IInternetProtocol::Read() 以请求该 url 的数据.

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

关于c++ - C++中如何为嵌入式web控件提供图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8265887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com