У нас есть устаревшее приложение C ++ (MFC). Одна его часть содержит объект CWebBrowser2, в котором мы переходим к URL-адресу, который является новым модулем, который мы разрабатываем для добавления в наше приложение.
Модуль представляет собой приложение HTML5. Поскольку CWebBrowser2 использует IE (в настоящее время IE8), URL, который мы передаем ему, загружает Chrome Frame и передает этот другой URL, который является нашим модулем.
Итак, URL-адрес выглядит примерно так (примечание: пользователь не может ввести это, он настроен нами для каждого сайта):
http://server/ChromeFrameWrapper.htm?http://server/Module.htm?Param1=something&Param2=somethingElse
Внутри ChromeFrameWrapper.htm у нас есть код, который будет захватывать URL, брать часть после первого? и установите для него chromeFrame.src, таким образом, наш модуль хорошо отображается в нашем приложении C ++.
Теперь проблема. В этом модуле HTML5 у нас есть несколько кнопок навигации (примечание: это может быть привязка, если это то, что нужно). То, что мы хотим, чтобы произошло, когда пользователь нажимает одну из этих кнопок, основное приложение (приложение C ++ MFC) уведомляется о щелчке.
Поскольку есть несколько кнопок, нам нужно знать, какая это кнопка, поскольку мы будем перемещаться в разные места в приложении C ++ на основе того, на что нажали (у нас есть причины для этого, это просто первый шаг в нашей полной замене приложения C ++).
В приложении C ++ я могу получить объект IHTMLDocument2 и коллекцию тегов, однако это для HTML ChromeFrameWrapper. Это так далеко, как я смог зайти так далеко.
Вот сценарий и основной HTML для ChromeFrameWrapper.htm. Обратите внимание, мы пытаемся доказать, что это работает, поэтому не критикуйте код, если только это не решит мою проблему.
Спасибо за любую помощь и понимание.
<SCRIPT type="text/javascript">
function GetChromeFrame() {
var chromeFrame = window.document.ChromeFrame
return chromeFrame;
}
function onLoad() {
var theUrl = window.location.href;
// just grab the arguments and pass them as is
var chromeFrameSource = GetArgumentsFromUrl(theUrl);
var chromeFrame = GetChromeFrame();
chromeFrame.src = chromeFrameSource;
}
function GetArgumentsFromUrl(theUrl)
{
if(theUrl.indexOf("?") != -1)
{
return theUrl.substring(theUrl.indexOf("?") + 1);
}
return "";
}
</SCRIPT>
<BODY onload="onLoad();">
<center>
<OBJECT ID="ChromeFrame" WIDTH=1060 HEIGHT=800 CODEBASE="http://www.google.com" CLASSID="CLSID:E0A900DF-9611-4446-86BD-4B1D47E7DB2A">
<PARAM NAME="src" VALUE="http://www.google.com" />
<embed ID="ChromeFramePlugin" NAME="ChromeFrame" SRC="http://www.google.com" TYPE="application/chromeframe"/>
</OBJECT>
</center>
</BODY>
Как предположил Шейн Холлоуэй, это было достигнуто с помощью WebSockets.
Я открыл прослушивающий сокет в своем приложении MFC, а затем приложение HTML5 открыло веб-сокет для подключения к сокету в приложении MFC.
Просто. Я подходил ко всему неправильно.
Не знаю, будет ли это полезным вопросом / ответом для кого-либо еще, но подумал, что поделюсь решением, которое я реализовал, так как оно работает ОТЛИЧНО.
Других решений пока нет …