AcitecX雖然是一個古老而經典的應用技術,但在技術變革日新月異的今天仍然是那麼的實用。缺了它又找不出更適合的技術來代替它。
這不,最近公司某產品的一個應用場景中,它又被我拉出來操練了一把。
接著難題來了,以前都是JS調用ActiveX中的函數,從沒在ActiveX中調用過JS。
後來到google上一搜“c# activex 調用js”,找到了一個調用方法。
由於該方法,可通過我提供的關鍵字搜索獲得,就不再詳細描述。方法中的關鍵步驟如下:
1,聲明 IOleClientSite 和 IOleContainer 兩個接口。
2,通過一系列的轉換,獲得 IHTMLDocument 和 IHTMLWindow2 。
3,調用JS函數。
該方法是一個穩扎穩打的方法,值得大家學習。在理解了該方法後,我總結了一下其關鍵點就是獲得IHTMLWindow2。
本人是一個懶惰蟲,在了解其關鍵點後,將其方法做了精簡,在此與大家分享。廢話不多說,上代碼。
思路:
1,通過JS將IHTMLWindow2直接傳入,省去一大堆聲明與轉換代碼。直接切入重點。
2,調用語法采用JS語法,方便書寫與理解。
代碼:
js代碼如下
[javascript]
<script type="text/javascript>
activexObj.SetFunc(window, "func");//activexObj為activex對象,"func"是JS函數名。通過參數傳遞函數名,可以令代碼更加靈活。
function func(value) {
alert(value);
}
</script>
C#代碼如下
注意:項目必須引用Microsoft.mshtml。
[csharp]
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");
}
}