• MSScriptControl詳解(可實現在C#等語言中調用JAVASCRIPT代碼)

    時間:2011年01月16日 點擊:5835
    ScriptControl接口

    屬性名稱
    類型
    備注
    AllowUI
    BOOL
    檢測是否允許運行用戶的接口元素。如果為False,則諸如消息框之類的界面元素不可見。
    CodeObject
    Object
    腳本暴露給宿主調用的對象。只讀。
    Modules
    Modules
    宿主提供給腳本的組件庫模塊。只讀。(COM組件通常都是以對象收集的形式向用戶提供可以留給用戶二次開發的對象集合,每一個收集即一個Modules)
    Language
    String
    設置或獲取腳本引擎解釋的語言,例如:VBScript、JScript。
    Name
    String
    腳本引擎的名稱。只讀。
    Procedures
    Procedures
    返回模塊中定義的過程的集合
    SitehWnd
    HWND
    在腳本中顯示UI的父窗口句柄
    State
    Enum
    設置或返回控件的狀態,如果為0,控件只執行語句但不轉發事件,為1則為加入的本控件接受的對象轉發事件。
    Timeout
    Long
    控件的執行腳本的超時值,-1表示不超時
    UseSafeSubset
    BOOL
    設置或返回宿主程序是否關心安全。宿主程序的安全級別可以從此屬性設置
    Error
    Error
    錯誤對象,發生錯誤時,此屬性返回一個錯誤對象

     

    方法名稱
    參數
    功能
    AddCode
    Code As String
    往腳本引擎中加入要執行的腳本
    AddObject
    Name As String, Object As Object, [AddMembers As Boolean = False]
    往腳本引擎加入一個對象,以便在腳本中可以使用該對象提供的方法等。
    Eval
    Expression As String
    表達式求值
    ExecuteStatement
    Statement As String
    解釋并執行腳本語句
    Reset
     
    丟棄所有的對象和代碼,將State屬性置0。
    Run
    ProcedureName As String, ParamArray Parameters() As Variant
    運行一個指定的過程

     

    事件名稱
    功能
    Error
    有錯誤發生時激發該事件
    TimeOut
    執行過程超時時發生

     
    一般使用方法
    1、在程序中加入ScriptControl
    2、定義一個ScriptControl的實例
    3、調用AddCode等方法向腳本引擎中加入要執行的腳本。
    4、調用Run執行要執行的腳本函數。
    宿主與腳本的通訊
    1、 宿主調用腳本:這個過程比較簡單,只要調用Run就可以將參數傳遞到腳本。
    2、 腳本調用宿主:在初始化過程中調用AddObject接口,將宿主的一個或多個對象暴露給腳本,這時就可以在腳本中調用宿主對象的方法。在VC++中這個對象不是普通的C++類,它必須支持自動化,在腳本中也只能調用對象中自動化接口(在VB中這個個程相對比較簡單)。
    腳本調試
    任何人寫的代碼都不可能一次就很完美,但是腳本由于執行的位置特殊,調試方法也不一樣。首先下載一個腳本調試器(我用的是Microsoft Script Debugger, 在MS網站有下載,另據說其它的如VJ++也可以),安裝以后在菜單上沒有啟動菜單。
    調試器的啟動
    在一般的高級語言中都可以方便的設置斷點,但是在啟動腳本調試器以前如何開始調試呢?在IE中腳本出錯會自動提示是否調試,還可以在腳本中加入中斷代碼(VBScript: Stop JavaScript: debugger),但是在ScriptControl還需要修改一下注冊表才可以,你需要將HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings下的JITDebug的值改為1(默認為0)

    以下是C#引用的完整代碼示例:

    1. using System;   
    2. using MSScriptControl;   
    3. using System.Text;   
    4. namespace ZZ   
    5. {   
    6. /// <summary>   
    7. /// 腳本類型   
    8. /// </summary>   
    9. public enum ScriptLanguage   
    10. {   
    11. /// <summary>   
    12. /// JScript腳本語言   
    13. /// </summary>   
    14. JScript,   
    15. /// <summary>   
    16. /// VBscript腳本語言   
    17. /// </summary>   
    18. VBscript,   
    19. /// <summary>   
    20. /// javascript腳本語言   
    21. /// </summary>   
    22. javascript   
    23. }   
    24. /// <summary>   
    25. /// 腳本運行錯誤代理   
    26. /// </summary>   
    27. public delegate void RunErrorHandler();   
    28. /// <summary>   
    29. /// 腳本運行超時代理   
    30. /// </summary>   
    31. public delegate void RunTimeoutHandler();   
    32. /// <summary>   
    33. /// ScriptEngine類   
    34. /// </summary>   
    35. public class ScriptEngine   
    36. {   
    37. private ScriptControl msc;   
    38. //定義腳本運行錯誤事件   
    39. public event RunErrorHandler RunError;   
    40. //定義腳本運行超時事件   
    41. public event RunTimeoutHandler RunTimeout;   
    42. /// <summary>   
    43. ///構造函數   
    44. /// </summary>   
    45. public ScriptEngine():this(ScriptLanguage.VBscript)   
    46. {   
    47. }   
    48. /// <summary>   
    49. /// 構造函數   
    50. /// </summary>   
    51. /// <param name="language">腳本類型</param>   
    52. public ScriptEngine(ScriptLanguage language)   
    53. {   
    54. this.msc = new ScriptControlClass();   
    55. this.msc.UseSafeSubset = true;   
    56. this.msc.Language = language.ToString();   
    57. ((DScriptControlSource_Event)this.msc).Error += 
      new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);   
    58. ((DScriptControlSource_Event)this.msc).Timeout += 
      new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);   
    59. }   
    60. /// <summary>   
    61. /// 運行Eval方法   
    62. /// </summary>   
    63. /// <param name="expression">表達式</param>   
    64. /// <param name="codeBody">函數體</param>   
    65. /// <returns>返回值object</returns>   
    66. public object Eval(string expression,string codeBody)   
    67. {   
    68. msc.AddCode(codeBody);   
    69. return msc.Eval(expression);   
    70. }   
    71. /// <summary>   
    72. /// 運行Eval方法   
    73. /// </summary>   
    74. /// <param name="language">腳本語言</param>   
    75. /// <param name="expression">表達式</param>   
    76. /// <param name="codeBody">函數體</param>   
    77. /// <returns>返回值object</returns>   
    78. public object Eval(ScriptLanguage language,string expression,string codeBody)   
    79. {   
    80. if(this.Language != language)   
    81. this.Language = language;   
    82. return Eval(expression,codeBody);   
    83. }   
    84. /// <summary>   
    85. /// 運行Run方法   
    86. /// </summary>   
    87. /// <param name="mainFunctionName">入口函數名稱</param>   
    88. /// <param name="parameters">參數</param>   
    89. /// <param name="codeBody">函數體</param>   
    90. /// <returns>返回值object</returns>   
    91. public object Run(string mainFunctionName,object[] parameters,string codeBody)   
    92. {   
    93. this.msc.AddCode(codeBody);   
    94. return msc.Run(mainFunctionName,ref parameters)  

     

    贊助商鏈接

    熱門內容

    相關內容

    聯系我們

    聯系方式
    亚洲AV口工动漫在线观看无码