Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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
C#BHO从Javascript返回值_C#_Javascript_Internet Explorer_Bho_Mshtml - Fatal编程技术网

C#BHO从Javascript返回值

C#BHO从Javascript返回值,c#,javascript,internet-explorer,bho,mshtml,C#,Javascript,Internet Explorer,Bho,Mshtml,我有一个C#BHO,它调用文档中的一些JS函数。通常我是这样做的(一切都很顺利): 但现在我需要将JS方法的值返回给我的BHO。我实现了testjs方法,该方法返回一个字符串,但当我使用execScript时,不会返回任何内容。我开始阅读文档,发现现在他们建议改为使用 但是我从我的C#BHO那里找不到任何关于如何称呼这个的信息。我发现甚至还有一个c#示例,但它假设我托管WebBrowser控件,并建议使用Document.InvokeScript。在MSHTML中,IHTMLDocument*接

我有一个C#BHO,它调用文档中的一些JS函数。通常我是这样做的(一切都很顺利):

但现在我需要将JS方法的值返回给我的BHO。我实现了testjs方法,该方法返回一个字符串,但当我使用execScript时,不会返回任何内容。我开始阅读文档,发现现在他们建议改为使用

但是我从我的C#BHO那里找不到任何关于如何称呼这个的信息。我发现甚至还有一个c#示例,但它假设我托管WebBrowser控件,并建议使用Document.InvokeScript。在MSHTML中,IHTMLDocument*接口都没有InvokeScript方法。我错过什么了吗

编辑1:以下是如何从execScript获取返回值的答案。但如果MSDN表示不再支持execScript,那么使用它可能并不明智

编辑2: 有关此问题的更多代码。首先,我有一个类似这样的JS函数(在一个名为func.JS的文件中):

然后在我的BHO中,我将此脚本注入页面,如下所示:

StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("func.js"));
string scriptContent = reader.ReadToEnd();
IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)ihtmlDoc2.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject = (IHTMLScriptElement)htmlDoc2.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = scriptContent;
((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);
然后在BHO的另一部分中,我想从getElemHtml()获取返回值:


但是retVal是空的。我看到脚本被执行,我看到返回值不是null,因为我看到了带有返回值的警报窗口。我想要的是C#BHO代码中这个JS函数的返回值。看起来这可以用这个来完成,但正如我所说的。问题是如何调用EVE并从JS函数中得到返回值。

< P>我发现了一些链接,这些链接允许从C++中获得JS返回值,但是我没有在C中转换它们,所以这里有一个对我有用的解决方法:

// Execute method and save return value to a new document property.
ieHtmlWindow2.execScript("document.NewPropForResponse = getElemHtml();");

// Read document property.
var property = ((IExpando)ieHtmlDocument2).GetProperty("NewPropForResponse", BindingFlags.Default);
if (property != null)
    return property.GetValue(ieHtmlDocument2, null);  // returns return value from getElemHtml.

你的两行代码没有提供太多的信息。发布您的代码。@L.B,我的整个BHO代码有点太复杂,无法发布,我可以稍后创建一个演示BHO项目,但问题是IHTMLWIndow2.exec脚本不再受支持,并且在任何情况下都不能正常工作。我在问是否有人有从c#bhoI调用“eval”的例子,可以发布一些代码,但我不确定您真正想做什么。如果你不解释你到底想做什么,我们也帮不了你。请阅读以了解我的意思。@L.B,有趣的链接:)添加了更多的代码。您实际上想在这里做什么?如果你告诉我们你想要完成什么,也许我们可以指导你找到更好的解决方案。
StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("func.js"));
string scriptContent = reader.ReadToEnd();
IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)ihtmlDoc2.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject = (IHTMLScriptElement)htmlDoc2.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = scriptContent;
((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);
var retVal = ihtmlWindow2.execScript("getElemHtml();");
// Execute method and save return value to a new document property.
ieHtmlWindow2.execScript("document.NewPropForResponse = getElemHtml();");

// Read document property.
var property = ((IExpando)ieHtmlDocument2).GetProperty("NewPropForResponse", BindingFlags.Default);
if (property != null)
    return property.GetValue(ieHtmlDocument2, null);  // returns return value from getElemHtml.