MSScriptControl.ScriptControl组件的用法实例

Microsoft(R) Script 控件使用户可以创建运行任何 ActiveX(R) scripting 引擎,例如 Microsoft(R) Visual Basic (R) Scripting Edition 或Microsoft(R) JScript(TM) 的应用程序。用户可以将任何 Automation 对象的对象模型添加到 Script 控件中,这样该对象的方法和属性就可以为 scripting 引擎所使用。通过将某个应用程序的对象模型和某个scripting 引擎加以综合,用户就可以创建一个结合了两方面优点的 scripting 应用程序。应用程序不但具有 scripting 语言的简单化特点,而且综合了一种更高级、具有完整特性的专业应用程序的对象、方法,以及属性。

创建 Script 控件的实例

Microsoft Script 控件可作为一个控件或者作为一个独立的 Automation 对象创建出来。该特性可以使得用任何语言书写的应用程序都可以用 ScriptControl 宿主任何兼容的 scripting 语言。

下面的示例可使用任意格式。请注意变量 sc 并未声明为类型 ScriptControl,因为该控件不是,也不必要是工程中所引用的。只要 Script 控件出现并进行注册,下面的代码就可正常工作:

代码如下:

Private Sub Command1_Click()
Dim sc
Dim strProgram As String
strProgram = "Sub Main" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
Set sc = CreateObject("ScriptControl")
sc.language = "VBScript"
sc.addcode strProgram
sc.run "Main"
End Sub

如果用户在自己的工程中的引用中对 Script 控件进行显式引用,那么用户就可以用下面的代码创建 Script 控件的一个

实例:

代码如下:

Dim sc As ScriptControl

显示用户接口元素 AllowUI 属性决定了 scripting 引擎是否可以显示用户接口元素。这可以应用于 Script 控件本身,例如显示超时消息。

这也可以应用于使用 ActiveX scripting 接口的 scripting 引擎。例如,下面的代码将在试图显示 Hello World 消息框时产生一个错误:

代码如下:

ScriptControl1.AllowUI = False
Dim strX As String
strX = "Sub Hello" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
ScriptControl1.AddCode strX
ScriptControl1.Run "Hello" ' 没有允许的 UI!

创建 Scripting 代码

Microsoft Script 控件使用户可以创建一个运行 scripting 语言,例如 VBScript 或 JScript 的应用程序。例如,假设用户在窗体上有一个按钮,用户希望在按下该按钮时运行某些 VBScript 代码。该按钮称为 Run NameMe,而用户希望scripting 代码运行一个叫 NameMe 的过程。意图是当用户单击 Run NameMe 按钮时,VBScript scripting 引擎执行 NameMe 过程。

这个 Run NameMe 按钮使用 Script Control 的 Run 方法来执行脚本。下面就是应当出现在 Run NameMe 按钮的 Click 事件中的代码:

代码如下:

' Script Control 的名字是 ScriptControl1。
Private Sub RunNameMe_Click()
ScriptControl1.Run "NameMe"
End Sub

为了创建该脚本所需要代码的其余部分,请选择一种 scripting 语言,并将代码添加到某个过程中,然后运行该过程。

选择一种Scripting 语言

第一步是为 Script Control 配置正确的 scripting 语言。当在某页上作为控件创建 Script Control 时,Language 属性就被自动初始化为 "VBScript"。当作为一个 Automation 对象来创建 Script Control 时,则 Language 属性留作未初
始化的状态,而必须由代码作者对其进行设置。

若要将 Language 属性设置为 JScript,可使用 Properties 窗口。用户也可以在代码中使用 Language 属性,如下所
示:

代码如下:

ScriptControl1.Language = "JScript"

其他 scripting 语言,例如 PERL 和 REXX,都不是由 Microsoft 所提供的,也可以为 Script 控件所用。

将代码添加到某个过程中

在用户运行 NameMe 过程之前,可使用 AddCode 方法将完整的过程添加到 Script 控件中。如果用户试图将一个不完整的过程(一个没有 End Sub 或者 End Function 的过程)添加进去,则将会出错。下面的代码将过程代码添加到 Script
Control 中:

代码如下:

' 当 ScriptRun 应用程序加载时,添加下面的代码
' 将 NameMe 过程添加到 Control 中。
Private Sub Form_Load()
Dim strCode As String
strCode = "Sub NameMe()" & vbCrLf & _
" Dim strName As String" & vbCrLf & _
" strName = InputBox(""Name?"")" & vbCrLf & _
" MsgBox ""Your name is "" & strName" & vbcrLf & _
"End Sub"
ScriptControl1.AddCode strCode
End Sub

另外,用户也可以从某个 TextBox 控件添加过程代码:

代码如下:

Private Sub Form_Load()
' 该代码包含在名为 frmScript 的窗体上
' 名为 txtScript 的 Textbox中。
ScriptControl1.AddCode frmScript.txtScript.Text
End Sub

用户可以将参数添加到某个过程或者函数中。

代码如下:

Private Sub EvalFunc()
' 创建函数。
Dim strFunction As String
strFunction = _
"Function ReturnThis(x, y)" & vbCrLf & _
" ReturnThis = x * y" & vbCrLf & _
"End Function"
' 添加代码,然后运行该函数。
ScriptControl1.AddCode strFunction
MsgBox ScriptControl1.Run("ReturnThis", 3, 25)
End Sub

运行过程

Run 方法运行任何已被添加到 Script 控件中的完整过程。下面的代码段运行三个已定义过程:

代码如下:

ScriptControl1.Run "FindName"
ScriptControl1.Run "AddName"
ScriptControl1.Run "Quit"

执行 Scripting 语句,并计算结果,用户可以用 ExecuteStatement 方法执行一条 scripting 语句。用户可以用 eval 方法计算某个表达式值。在下面的示例
中,用 ExecuteStatement 方法将值 100 赋给变量 x。下面的两行用 eval 方法来测试语句 x = 100 和 x = 100/2。第二行返回 True;而第三行则返回 False。

代码如下:

Private Sub TryThis()
ScriptControl1.ExecuteStatement "x = 100"
MsgBox ScriptControl1.Eval("x = 100") ' 返回 True
MsgBox ScriptControl1.Eval("x = 100/2") ' 返回 False
End Sub

使用 Error 属性

Script 控件错误有两个可能来源:Script 控件自身,或者该控件试图运行的 script。为了对 scripting 代码进行调试,可使用 Error 属性,该属性返回对 Error 对象的引用。利用 Error 对象,Script 控件可以返回错误数目和对它的
描述,以及错误在 script 中出现的行号。

运行下面的代码,查看 Script 控件发现错误的一个示例:

代码如下:

Private Sub MyError()
' 下面的代码被零除导致
' 一个错误。
Dim strCode As String
strCode = _
"Sub DivideByZero()" & vbCrLf & _
"Dim prime" & vbCrLf & _
"prime = 3" & vbCrLf & _
"MsgBox prime/0" & vbCrLf & _
"End Sub"
On Error GoTo scError
With ScriptControl1
.AddCode strCode
.Run "DivideByZero"
End With
Exit Sub
scError:
' 使用 Error 对象向用户通告
' 错误,以及出错行。
Debug.Print ScriptControl1.Error.Number & _
":" & ScriptControl1.Error.Description & _
" in line " & ScriptControl1.Error.Line
Exit Sub
End Sub

(0)

相关推荐

  • asp.net neatUpload 支持大文件上传组件

    1.在工具箱中添加Brettle.Web.NeatUpload.dll,可以看到工具箱中出现InputFile等控件. 2.复制文件夹NeatUpload到根目录. 3.拖放使用上传控件InputFile和进度条ProgressBar,添加上传文件的按钮.aspx页面代码如下: 复制代码 代码如下: <body> <form id="form1" runat="server"> <div> <upload:InputFile

  • asp.net 不用组件的URL重写(适用于较大型项目)

    先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <urls> <rewrite name="default" path="/default-{0}-{1}.aspx" pattern = "/default-

  • asp.net中Word转Html的办法(不需要WORD组件)

    基本思路:把Word文件上传到服务器,读取其内容存储为Html,然后加载Html内容 1:使用Microsoft.Office.Interop.Word组件     这是比较常用的一种方式,代码就不贴出了,网上大把的例子     缺点:服务器需要装Word的组件,并且需要在服务器上设置Docm+对象的权限,如果一台服务器还好,如果项目应用到多台不同服务器,就比较繁琐了2: OpenXml API      可以将.docx(word 97-2003 不适用)转化为XML,有了XML,想转成HTM

  • asp.net(C#)防sql注入组件的实现代码

    在服务器安全栏目里我写过一篇<破解通用Sql防注入方法>的文章中说到,一些通用的防注入方法中没有对cookie数据进行过滤,会给黑客留下可乘之机.当然我的这段代码对提交过来的cookie数据也进行了过滤. 代码: 复制代码 代码如下: using System; using System.Configuration; using System.Web; using System.Globalization; namespace JNYW.StuM.SqlInject { public clas

  • asp.net MVC实现无组件上传图片实例介绍

    例子: 如我想上传一个图片到服务器端:asp页面 复制代码 代码如下: <form id="form1" runat="server" action="/bookIndex/fileUpLoad/(你准备处理的 ActionResult)" method="post" enctype="multipart/form-data"> <input type="file" i

  • asp.net中Fine Uploader文件上传组件使用介绍

    最近在处理后台数据时需要实现文件上传.考虑到对浏览器适配上采用Fine Uploader. Fine Uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要求类似IE版本必须是9或是更高的IE10].在不同浏览器中提供统一用户体验.该组件基本覆盖目前所有主流浏览器.同时没有任何第三方组件依赖.相当Clear.在服务器端已经覆盖支持了ASP.NET/ColdFusion/Java/Node.js/Perl/PHP/Python. 对上传细节类似限制文件大

  • MSScriptControl.ScriptControl组件属性、方法、事件介绍

    MSScriptControl.ScriptControl组件实例对象属性 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object 脚本暴露给宿主调用的对象.只读. Modules Modules 宿主提供给脚本的组件库模块.只读.(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules) Language String 设置或获取

  • 深入Lumisoft.NET组件与.NET API实现邮件发送功能的对比分析

    我在另一篇文章<深入Lumisoft.NET实现邮件发送功能的方法详解>有大致对这个Lumisoft.NET组件的使用进行了介绍,当然Lumisoft.NET组件除了提供邮件发送功能外,还提供了邮件接收等功能的处理(包括基于POP3协议和IMAP协议),而.NET则除了提供SMTP协议功能外,则没有提供POP3协议处理的相关类库,因此收取邮件这需要自己进行封装(需要也可以参考codeproject.com上的相关文章). 1..NET的邮件发送功能实现.NET本身封装了一个SmtpClient

  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    在Web开发中,有很多可以上传的组件模块,利用HTML的File控件的上传也是一种办法,不过这种方式,需要处理的细节比较多,而且只能支持单文件的操作.在目前Web开发中用的比较多的,可能uploadify(参考http://www.uploadify.com/)也算一个吧,不过这个版本一直在变化,他们的脚本调用也有很大的不同,甚至调用及参数都一直在变化,很早的时候,那个Flash的按钮文字还没法变化,本篇随笔主要根据项目实际,介绍一下3.1版本的uploadify的控件使用,这版本目前还是最新的

  • .NET程序集引用COM组件MSScriptControl遇到问题的解决方法

    问题描述:为了在C#中执行js脚本,在一个目标平台编译为Any Cpu的.NET程序集中引用了MSScriptControl组件,在winform程序中,调用这个程序集中的执行js的方法,没有任何问题.但是在windows服务中调用却报错,报错信息如下: 在尝试过很多方法之后仍然没有解决,包括将MSScriptControl组件的引用属性"嵌入互操作类型"设置为false,如图所示: 这样子修改之后,报另外一个错误: 解决方案:MSScriptControl组件是32位的,所以需要将程

随机推荐