AcitecX虽然是一个古老而经典的应用技术,但在技术变革日新月异的今天仍然是那么的实用。缺了它又找不出更适合的技术来代替它。
这不,最近公司某产品的一个应用场景中,它又被我拉出来操练了一把。
接着难题来了,以前都是JS调用ActiveX中的函数,从没在ActiveX中调用过JS。
后来到google上一搜“c# activex 调用js”,找到了一个调用方法。
由于该方法,可通过我提供的关键字搜索获得,就不再详细描述。方法中的关键步骤如下:
1,声明 IOleClientSite 和 IOleContainer 两个接口。
2,通过一系列的转换,获得 IHTMLDocument 和 IHTMLWindow2 。
3,调用JS函数。
该方法是一个稳扎稳打的方法,值得大家学习。在理解了该方法后,我总结了一下其关键点就是获得IHTMLWindow2。
本人是一个懒惰虫,在了解其关键点后,将其方法做了精简,在此与大家分享。废话不多说,上代码。
思路:
1,通过JS将IHTMLWindow2直接传入,省去一大堆声明与转换代码。直接切入重点。
2,调用语法采用JS语法,方便书写与理解。
代码:
js代码如下
<script type="text/javascript>
activexObj.SetFunc(window, "func");//activexObj为activex对象,"func"是JS函数名。通过参数传递函数名,可以令代码更加灵活。
function func(value) {
alert(value);
}
</script>
C#代码如下
注意:项目必须引用Microsoft.mshtml。
using mshtml;
public void SetFunc(object win, string func)
{
IHTMLWindow2 htmlWin = win as IHTMLWindow2;
if (htmlWin == null || string.IsNullOrEmpty(func))
{
MessageBox.Show("赋值错误。");
}
else
{
//以下是调用方法,由于仅仅是示例,所以直接放在SetFunc方法中了。实际开发中,大家根据情况放到相应地方。
//这里调用的方法我提供了两种:1,反射的方法;2,JS代码语法。
//大家可以根据自己熟悉的情况采用适合自己的方法。两种方法的效果都是一样的。
//方法1。
htmlWin.GetType().InvokeMember(func,
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
null, htmlWin, new object[] { "参数" });
//方法2。
string jsCode = string.Format("{0}('{1}')", func, "参数");
htmlWin.execScript(jsCode, "jscript");
}
}