2011-11-25 21 views
5

Nella mia app C++ sto incorporando (tramite COM) un controllo del browser Web (Internet Explorer) (CLSID_WebBrowser).Come fornire i dati delle immagini per il controllo Web incorporato in C++

Posso visualizzare il mio html in quel controllo utilizzando il metodo IHTMLDocument2::: write, ma se l'html ha l'elemento <img src="foo.png">, non viene visualizzato.

Suppongo che ci sia un modo per me di fornire i dati per foo.png in qualche modo al controllo web, ma non riesco a trovare il posto giusto per collegare questa funzionalità?

Ho bisogno di avere il pieno controllo della fornitura del contenuto di foo.png, quindi aggiri come usare res: // protocollo o salvare su disco e usare il protocollo file: // non sono abbastanza buoni. Voglio solo collegare il mio codice in qualche modo in modo che quando il controllo incorporato CLSID_WebBrowser vede <img src="foo.png"> nei dati html forniti con IHTMLDocument2 :: write() mi chiederà di fornire questi dati.

risposta

3

Per rispondere alla mia domanda, la soluzione che finalmente ha funzionato per me è:

  1. registro personalizzato IInternetProtocol/IInternetProtocolInfo/via personalizzato IClassFactory dato a IInternetSession :: registerNamespace(). Per ragioni che mi sembrano un bug, deve essere un protocollo già noto a IE (ho scelto "suo") anche se sarebbe stato molto meglio se fosse il mio spazio dei nomi unico.

  2. feed dati html tramite IMoniker personalizzato tramite IPersistentMoniker :: Load() e assicurarsi che IMoniker :: GetDisplayName() (che è un url di base in base al quale verranno risolti i collegamenti relativi nell'html fornito) inizi con tale protocollo schema (nel mio caso "its: //"). In questo modo il collegamento relativo "foo.png" nei dati html sarà il suo: //foo.png in IE che farà invocare urlmon IInternetProtocol :: Start() e IInternetProtocol :: Read() per chiedere i dati per quell'URL .

Tutto questo è piuttosto complicato, si può guardare il codice vero e proprio (con licenza BSD) qui: http://code.google.com/p/sumatrapdf/source/browse/trunk/src/utils/HtmlWindow.cpp

0

È possibile incorporare un piccolo server web come mangusta e fare riferimento a tale impiglio da lì.

In mangusta, è possibile allegare il callback a un percorso specifico, restituendo così le immagini dal codice C++.

usiamo questo per i nostri strumenti di debug, in cui ogni immagine è accessibile da un'interfaccia web

+0

Questa è una possibilità, ma spero ci sia una soluzione più semplice che coinvolge solo l'interazione con controllo web direttamente. –

0

La soluzione più semplice sarebbe un Data URI. Dovresti mettere in linea l'immagine direttamente con IHTMLDocument2::write().

+0

Anche questa è una possibilità, ma l'html non è realmente generato da me e non è semplice sostituire img link con dati in html esistenti –