Krz*_*zyk 7 c++ winapi win32gui win32com
在我的C++应用程序中,我嵌入了(通过COM)Web浏览器(Internet Explorer)控件(CLSID_WebBrowser).
我可以使用IHTMLDocument2 :: write()方法在该控件中显示我自己的html,但如果html有<img src="foo.png">元素,则不会显示.
我假设有一种方法让我以某种方式为web控件提供foo.png的数据,但我找不到合适的地方来挂钩这个功能?
我需要完全控制提供foo.png的内容,所以解决方法如使用res://协议或保存到磁盘并使用file://协议都不够好.我只是想以某种方式插入我的代码,以便当嵌入式CLSID_WebBrowser控件<img src="foo.png">在IHTMLDocument2 :: write()给出的html数据中看到它时,它会要求我提供这些数据.
要回答我自己的问题,最终对我有用的解决方案是:
通过提供给IInternetSession :: RegisterNameSpace()的自定义IClassFactory注册自定义IInternetProtocol / IInternetProtocolInfo /。出于对我来说似乎是个错误的原因,它必须是IE已知的协议(我选择了“它”),即使它是我自己的唯一名称空间会更好。
通过IPersistentMoniker :: Load()通过自定义IMoniker提供html数据,并确保IMoniker :: GetDisplayName()(这是一个基本URL,根据该URL将解析提供的html中的相对链接)以该协议方案开头(在我的情况下) “它的://”)。这样,html数据中的相对链接“ foo.png”将是其IE的://://foo.png,这将使urlmon调用IInternetProtocol :: Start()和IInternetProtocol :: Read()来请求该URL的数据。 。
这一切都相当复杂,您可以在这里查看实际的(BSD许可)代码:http : //code.google.com/p/sumatrapdf/source/browse/trunk/src/utils/HtmlWindow.cpp