2011-11-25 17 views
5

在我的C++應用程序中,我嵌入(通過COM)一個Web瀏覽器(Internet Explorer)控件(CLSID_WebBrowser)。如何在C++中爲嵌入式Web控件提供圖像數據

我可以使用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

要回答我的問題,終於爲我工作的解決方案是:

  1. 註冊自定義IInternetProtocol/IInternetProtocolInfo /通過給IInternetSession定製的IClassFactory :: RegisterNameSpace()。由於對我來說看起來像一個bug的原因,它必須是IE已經知道的協議(我選擇了「它」),儘管如果它是我自己的唯一命名空間會更好。

  2. 通過自定義IMoniker通過IPersistentMoniker :: Load()並確保IMoniker :: GetDisplayName()(它是一個基礎url,根據提供的html中的相關鏈接將被解析)以該協議開始計劃(在我的情況下是「它的://」)。這種方式在HTML數據中的相對鏈接「foo.png」將是IE:它將使urlmon調用IInternetProtocol :: Start()和IInternetProtocol :: Read()來請求該網址的數據。

這都是相當複雜的,你可以看看實際的(BSD許可)代碼在這裏: http://code.google.com/p/sumatrapdf/source/browse/trunk/src/utils/HtmlWindow.cpp

0

您可以嵌入一個小型網絡服務器,如貓鼬,並參考那裏的那些記錄。

在貓鼬中,您可以將回調附加到特定路徑,從而從C++代碼返回圖像。

我們使用我們的調試工具,其中每個圖像是從網絡界面

+0

這是一個可能性,但我希望有一個更簡單的解決方案,只涉及與互動網頁控制直接。 –

0

最簡單的解決方案將是一個Data URI訪問。您可以直接使用IHTMLDocument2::write()列出圖像。

+0

這也是一種可能性,但是html並不是真的由我生成的,用現有的html中的數據替換img鏈接並不容易 –

相關問題