Как предоставить данные изображения для встроенного веб-элемента управления в C ++ - PullRequest
7 голосов
/ 25 ноября 2011

В моем приложении C ++ я встраиваю (через COM) элемент управления веб-браузера (Internet Explorer) (CLSID_WebBrowser).

Я могу отображать свой собственный HTML в этом элементе управления с помощью IHTMLDocument2 :: write ()метод, но если в html есть элемент <img src="foo.png">, он не отображается.

Я предполагаю, что у меня есть способ как-то предоставить данные для foo.png в веб-элемент управления, но я не могу найтиправильное место, чтобы перехватить эту функцию?

Мне нужно полностью контролировать предоставление содержимого foo.png, поэтому обходные пути, такие как использование протокола res: // или сохранение на диск и использование file: //протокол не достаточно хорош.Я просто хочу как-то подключить свой код, чтобы при встроенном элементе управления CLSID_WebBrowser он видел <img src="foo.png"> в html-данных, переданных с помощью IHTMLDocument2 :: write (), и попросил предоставить эти данные.

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

Чтобы ответить на мой собственный вопрос, решение, которое наконец-то сработало для меня:

  1. зарегистрировать пользовательский IInternetProtocol / IInternetProtocolInfo / через пользовательский IClassFactory, предоставленный IInternetSession :: RegisterNameSpace (). По причинам, которые кажутся мне ошибкой, это должен быть протокол, уже известный IE (я выбрал «его»), хотя было бы намного лучше, если бы это было мое собственное, уникальное пространство имен.

  2. подача данных html через пользовательский IMoniker через IPersistentMoniker :: Load () и убедитесь, что IMoniker :: GetDisplayName () (который является базовым URL-адресом, в соответствии с которым разрешаются относительные ссылки в предоставленном html) начинается с этого схема протокола (в моем случае "its: //"). Таким образом, относительная ссылка "foo.png" в данных html будет являться его: //foo.png для IE, что заставит urlmon вызывать IInternetProtocol :: Start () и IInternetProtocol :: Read () для запроса данных для этого URL .

Все это довольно сложно, вы можете посмотреть действительный (BSD-лицензированный) код здесь: http://code.google.com/p/sumatrapdf/source/browse/trunk/src/utils/HtmlWindow.cpp

0 голосов
/ 25 ноября 2011

Самым простым решением будет URI данных .Вы бы добавили изображение прямо с помощью IHTMLDocument2::write().

0 голосов
/ 25 ноября 2011

Вы можете встроить небольшой веб-сервер, такой как mongoose, и ссылаться на тех, кто заражен оттуда.

В mongoose вы можете прикрепить обратный вызов к определенному пути, возвращая таким образом изображения из кода C ++.

Мы используем это для наших инструментов отладки, где каждое изображение доступно через веб-интерфейс

...