0

我们有一个旧版 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 对象和标签集合,但这是针对 ChromeFrameWrapper HTML 的。到目前为止,我已经能够做到这一点。

  1. 是否有可能连接一些东西,以便我们的 C++ 应用程序能够接收来自 HTML5 模块的点击事件?
  2. 如果是这样,怎么做?我被困住了,找不到任何涉及 Chrome Frame 托管 HTML 和事件的示例。使用 MSHTML 是正确的方式,还是有别的方法?

这是 ChromeFrameWrapper.htm 的 SCRIPT 和主要 HTML。请注意,我们正在尝试证明它有效,因此除非它解决了我的问题,否则没有代码批评。

感谢您的帮助和洞察力。

<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>
4

1 回答 1

2

正如 Shane Holloway 所说,这是使用 WebSockets 完成的。我在 MFC 应用程序中打开了一个监听套接字,然后让 HTML5 应用程序打开一个 websocket 以连接到 MFC 应用程序中的套接字。

简单的。我在接近这一切都错了。不知道这是否对其他人有用的问题/答案,但我想我会分享我实施的解决方案,因为它工作得很好。

于 2012-10-17T20:51:20.180 回答