Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从C++;_Javascript_C++_Mfc - Fatal编程技术网

Javascript 从C++;

Javascript 从C++;,javascript,c++,mfc,Javascript,C++,Mfc,我有一个CDHTMLDialog,有两个HTML页面和一个.js文件,其中包含一些相当简单的函数 我希望能够通过一个简单的数据类型从我的程序中调用一个JS函数。e、 g.MyFunc(int)。不需要归还任何东西 如果您能给我一些指导,我将不胜感激 谢谢 编辑:感谢CR的回答,也感谢所有提交想法的人 类似这样的东西最终奏效了(为了清晰起见,从中去掉了一些错误处理): void callJavaScriptFunc(int) { HRESULT hRes; CString函数; CString L

我有一个CDHTMLDialog,有两个HTML页面和一个.js文件,其中包含一些相当简单的函数

我希望能够通过一个简单的数据类型从我的程序中调用一个JS函数。e、 g.MyFunc(int)。不需要归还任何东西

如果您能给我一些指导,我将不胜感激

谢谢

编辑:感谢CR的回答,也感谢所有提交想法的人

类似这样的东西最终奏效了(为了清晰起见,从中去掉了一些错误处理):

void callJavaScriptFunc(int)
{
HRESULT hRes;
CString函数;
CString LangStr=“javascript”;
变量vEmpty={0};
CComPtr HTML2Doc;
CComPtr HTML2Wind;
hRes=GetDHtmlDocument(&HTML2Doc);
hRes=HTML2Doc->获取父窗口(&HTML2Wind);
如果(水果>0)
{
FuncStr=“myFunc(808)”;//可以使用Javascript参数
hRes=HTML2Wind->execScript(FuncStr.AllocSysString(),LangStr.AllocSysString(),&vEmpty);
}
}

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

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

除了编辑HTML并(重新)加载它之外,我看不到任何其他实现方法(可能我只是不知道一些合适的开箱即用的功能)——如果您必须一次性调用js方法或只是注入某种事件处理逻辑,这是非常方便和可行的。 如果您必须从MFC应用程序与页面交互,可能会有点痛苦。在这种情况下,您必须重新生成HTML并将其重新加载到您的对话框中

无论哪种方式,您都可以在HTML文件中使用某种占位符,查找占位符并替换为javascript代码,然后在您的HtmlDialog中加载页面:


onclick=“\uuuu my\u Javascript\u Call\u HERE\uuuu”
最简单的方法是在界面中使用该方法

因此,您可以通过调用从CDHTMLDialog获取接口,然后从IHTMLDocument2获取接口。父窗口将具有支持execScript()的IHTMLWindow2接口


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

SpiderMonkey库可以“从C++调用JavaScript函数”,请参阅


但在您的情况下,也许这不是答案。

您是指jscript吗?如何做到这一点取决于您使用的javascript引擎:spidermonkey、v8、nitro——但您说的是chtml对话,所以我猜您使用的是jscript?我相信是jscript。此外,我已经修复了我的打字错误,应该是CDHTMLDialog。只是为了把它放在一起,我刚刚把我对它的解释贴在了上面。谢谢,这很有效。我将在我的问题中发布一个代码片段,以便人们可以看到我的粗略解决方案。再次感谢。很好的解决方案-我不知道这种方法
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);
    }
}