MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)
生活随笔
收集整理的這篇文章主要介紹了
MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ScriptControl接口
?
| 屬性名稱 | 類型 | 備注 |
| AllowUI | BOOL | 檢測是否允許運(yùn)行用戶的接口元素。如果為False,則諸如消息框之類的界面元素不可見。 |
| CodeObject | Object | 腳本暴露給宿主調(diào)用的對象。只讀。 |
| Modules | Modules | 宿主提供給腳本的組件庫模塊。只讀。(COM組件通常都是以對象收集的形式向用戶提供可以留給用戶二次開發(fā)的對象集合,每一個(gè)收集即一個(gè)Modules) |
| Language | String | 設(shè)置或獲取腳本引擎解釋的語言,例如:VBScript、JScript。 |
| Name | String | 腳本引擎的名稱。只讀。 |
| Procedures | Procedures | 返回模塊中定義的過程的集合 |
| SitehWnd | HWND | 在腳本中顯示UI的父窗口句柄 |
| State | Enum | 設(shè)置或返回控件的狀態(tài),如果為0,控件只執(zhí)行語句但不轉(zhuǎn)發(fā)事件,為1則為加入的本控件接受的對象轉(zhuǎn)發(fā)事件。 |
| Timeout | Long | 控件的執(zhí)行腳本的超時(shí)值,-1表示不超時(shí) |
| UseSafeSubset | BOOL | 設(shè)置或返回宿主程序是否關(guān)心安全。宿主程序的安全級別可以從此屬性設(shè)置 |
| Error | Error | 錯(cuò)誤對象,發(fā)生錯(cuò)誤時(shí),此屬性返回一個(gè)錯(cuò)誤對象 |
?
?
| 方法名稱 | 參數(shù) | 功能 |
| AddCode | Code As String | 往腳本引擎中加入要執(zhí)行的腳本 |
| AddObject | Name As String, Object As Object, [AddMembers As Boolean = False] | 往腳本引擎加入一個(gè)對象,以便在腳本中可以使用該對象提供的方法等。 |
| Eval | Expression As String | 表達(dá)式求值 |
| ExecuteStatement | Statement As String | 解釋并執(zhí)行腳本語句 |
| Reset | 丟棄所有的對象和代碼,將State屬性置0。 | |
| Run | ProcedureName As String, ParamArray Parameters() As Variant | 運(yùn)行一個(gè)指定的過程 |
?
?
| 事件名稱 | 功能 |
| Error | 有錯(cuò)誤發(fā)生時(shí)激發(fā)該事件 |
| TimeOut | 執(zhí)行過程超時(shí)時(shí)發(fā)生 |
?
一般使用方法 1、在程序中加入ScriptControl 2、定義一個(gè)ScriptControl的實(shí)例 3、調(diào)用AddCode等方法向腳本引擎中加入要執(zhí)行的腳本。 4、調(diào)用Run執(zhí)行要執(zhí)行的腳本函數(shù)。 宿主與腳本的通訊 1、?宿主調(diào)用腳本:這個(gè)過程比較簡單,只要調(diào)用Run就可以將參數(shù)傳遞到腳本。 2、?腳本調(diào)用宿主:在初始化過程中調(diào)用AddObject接口,將宿主的一個(gè)或多個(gè)對象暴露給腳本,這時(shí)就可以在腳本中調(diào)用宿主對象的方法。在VC++中這個(gè)對象不是普通的C++類,它必須支持自動化,在腳本中也只能調(diào)用對象中自動化接口(在VB中這個(gè)個(gè)程相對比較簡單)。 腳本調(diào)試 任何人寫的代碼都不可能一次就很完美,但是腳本由于執(zhí)行的位置特殊,調(diào)試方法也不一樣。首先下載一個(gè)腳本調(diào)試器(我用的是Microsoft Script Debugger, 在MS網(wǎng)站有下載,另據(jù)說其它的如VJ++也可以),安裝以后在菜單上沒有啟動菜單。 調(diào)試器的啟動 在一般的高級語言中都可以方便的設(shè)置斷點(diǎn),但是在啟動腳本調(diào)試器以前如何開始調(diào)試呢?在IE中腳本出錯(cuò)會自動提示是否調(diào)試,還可以在腳本中加入中斷代碼(VBScript: Stop JavaScript: debugger),但是在ScriptControl還需要修改一下注冊表才可以,你需要將HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings下的JITDebug的值改為1(默認(rèn)為0)以下是C#引用的完整代碼示例:
using System; using MSScriptControl; using System.Text; namespace ZZ { /// <summary> /// 腳本類型 /// </summary> public enum ScriptLanguage { /// <summary> /// JScript腳本語言 /// </summary> JScript, /// <summary> /// VBscript腳本語言 /// </summary> VBscript, /// <summary> /// javascript腳本語言 /// </summary> javascript } /// <summary> /// 腳本運(yùn)行錯(cuò)誤代理 /// </summary> public delegate void RunErrorHandler(); /// <summary> /// 腳本運(yùn)行超時(shí)代理 /// </summary> public delegate void RunTimeoutHandler(); /// <summary> /// ScriptEngine類 /// </summary> public class ScriptEngine { private ScriptControl msc; //定義腳本運(yùn)行錯(cuò)誤事件 public event RunErrorHandler RunError; //定義腳本運(yùn)行超時(shí)事件 public event RunTimeoutHandler RunTimeout; /// <summary> ///構(gòu)造函數(shù) /// </summary> public ScriptEngine():this(ScriptLanguage.VBscript) { } /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="language">腳本類型</param> public ScriptEngine(ScriptLanguage language) { this.msc = new ScriptControlClass(); this.msc.UseSafeSubset = true; this.msc.Language = language.ToString(); ((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error); ((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout); } /// <summary> /// 運(yùn)行Eval方法 /// </summary> /// <param name="expression">表達(dá)式</param> /// <param name="codeBody">函數(shù)體</param> /// <returns>返回值object</returns> public object Eval(string expression,string codeBody) { msc.AddCode(codeBody); return msc.Eval(expression); } /// <summary> /// 運(yùn)行Eval方法 /// </summary> /// <param name="language">腳本語言</param> /// <param name="expression">表達(dá)式</param> /// <param name="codeBody">函數(shù)體</param> /// <returns>返回值object</returns> public object Eval(ScriptLanguage language,string expression,string codeBody) { if(this.Language != language) this.Language = language; return Eval(expression,codeBody); } /// <summary> /// 運(yùn)行Run方法 /// </summary> /// <param name="mainFunctionName">入口函數(shù)名稱</param> /// <param name="parameters">參數(shù)</param> /// <param name="codeBody">函數(shù)體</param> /// <returns>返回值object</returns> public object Run(string mainFunctionName,object[] parameters,string codeBody) { this.msc.AddCode(codeBody); return msc.Run(mainFunctionName,ref parameters) }?
轉(zhuǎn)載于:https://www.cnblogs.com/coolsundy/p/7116123.html
總結(jié)
以上是生活随笔為你收集整理的MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces round 422
- 下一篇: IEnumerable和IEnumera