从C++中调用一个JavaScript函数

6
我有一个CDHTMLDialog,其中包含2个HTML页面和一个带有几个相当简单功能的.js文件。
我想要能够通过传递一个简单的数据类型来从程序中调用其中一个JS函数,例如MyFunc(int)。不需要返回任何内容。
我希望能得到如何实现这一点的指导,
谢谢。
编辑:感谢CR的回答,还有其他提交想法的人。最终类似以下代码能够运行(为了清晰起见,省略了少量错误处理):
void callJavaScriptFunc(int Fruit)
{
    HRESULT hRes;
    CString FuncStr;
    CString LangStr = "javascript";
    VARIANT vEmpty = {0};

    CComPtr<IHTMLDocument2> HTML2Doc;
    CComPtr<IHTMLWindow2> HTML2Wind;

    hRes = GetDHtmlDocument(&HTML2Doc);
    hRes = HTML2Doc->get_parentWindow(&HTML2Wind);

    if( Fruit > 0 ) 
    {
        FuncStr = "myFunc(808)";  // Javascript parameters can be used
        hRes = HTML2Wind->execScript(FuncStr.AllocSysString(), LangStr.AllocSysString(), &vEmpty);
    }
}

你是指JScript吗?这取决于你使用的JavaScript引擎:SpiderMonkey、V8、Nitro。但你说CHTML对话框,所以我猜你正在使用JScript? - Breton
我相信它是Jscript。另外,我已经修正了我的拼写错误,应该是CDHTMLDialog。 - Andrew
为了保持一致,我在这个帖子上发布了我的解释。 - c00000fd
3个回答

3
最简单的方法是使用execScript()方法在IHTMLWindow2接口中。因此,您可以通过调用GetDHtmlDocumentCDHTMLDialog获取IHTMLDocument2接口,然后从IHTMLDocument2获取parentWindow。父窗口将具有支持execScript()IHTMLWindow2接口。

可能有更简单的方法从CDHTMLDialog获取IHTMLWindow2接口,但我习惯于在较低级别上工作。


谢谢,这个很好用。我会在我的问题中发布一个代码片段,让大家看到我的初步解决方案。再次感谢。 - Andrew
好的解决方案 - 我不知道这种方法。 - JohnIdol

2

1

为给您提示 - 在服务器端技术中执行 javascript 注入通常是在启动时通过批量加载 (GWT) 或在生成并服务每个 post-back (ASP.NET) 时注入的。两种方法的重要点是它们将 javascript 调用注入到页面的某个位置 (或在 GWT 的情况下链接到 HTML 中的一个单独的 .js 文件) 当生成 HTML 页面时。

即使您正在进行 win 开发 (看起来是这样,因为您使用了 MFC),您也可能需要在 HTML 中插入 js 方法调用,然后在 CHTMLDialog 中加载 (或重新加载,如果您希望从 MFC 应用程序与 html 交互) HTML 文件。

我没有看到实现此目标的其他方法 (也许我只是不知道一些合适的开箱即用功能),除了编辑您的 HTML 并 (重新) 加载它 - 这非常方便和可行,如果您只需要调用 js 方法一次或仅注入某种事件处理逻辑。如果您需要从 MFC 应用程序与页面交互,这可能会有点麻烦。在这种情况下,您必须重新生成您的 HTML,并在 CHTMLDialog 中重新加载它。

无论如何,您都可以在HTML文件中使用某种占位符,查找并替换为您的JavaScript代码,然后在CHTMLDialog中加载页面:

onclick="__my_Javascript_Call_HERE__"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接