如何访问主机对象和控件使用该vb scriptcontroll

查看: 2372|回复: 5
易语言调用JAVASCRIPT的方法(不用脚本组件)
阅读权限30
在线时间 小时
升级&&27.5%当前用户组为 易语言学徒当前积分为 155, 升到下一级还需要 145 点。结帖率: (1/4)
Microsoft ScriptControl 控件使用指南随着动态网页的出现,脚本语言已经被越来越多的人认识、接受并撑握。在程序中加入对脚本的支持一方面可以最大限度的扩展程序的应用范围,另一方面也方便程序员利用现有脚本提供的一些特别的功能(如正则表达式等)。下面结合我个人的一点经验谈一谈这方面的应用。
很显然要自己去实现一个脚本解释器是不现实的。好在已经有了可以复用的组件,那就是Microsoft ScriptControl。这是一个ActiveX控件,随Windows2000一起发布,如果要在2000以前的Windows中使用则需要安装该控件(可以到MS的网站上找到)。
ScriptControl接口
检测是否允许运行用户的接口元素。如果为False,则诸如消息框之类的界面元素不可见。CodeObject
脚本暴露给宿主调用的对象。只读。
宿主提供给脚本的组件库模块。只读。(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules)Language
设置或获取脚本引擎解释的语言,例如:VBScript、JScript。
脚本引擎的名称。只读。
Procedures
Procedures
返回模块中定义的过程的集合
在脚本中显示UI的父窗口句柄
设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件。
控件的执行脚本的超时值,-1表示不超时
UseSafeSubset
设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置
错误对象,发生错误时,此属性返回一个错误对象
Code As String
往脚本引擎中加入要执行的脚本
Name As String, Object As Object, [AddMembers As Boolean = False]
往脚本引擎加入一个对象,以便在脚本中可以使用该对象提供的方法等。
Expression As String
表达式求值
ExecuteStatement
Statement As String
解释并执行脚本语句
丢弃所有的对象和代码,将State属性置0。
ProcedureName As String, ParamArray Parameters() As Variant
运行一个指定的过程
有错误发生时激发该事件
执行过程超时时发生
一般使用方法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)
===================================
脚本对象.创建 (“ScriptControl”, )
脚本对象.写属性 (“Language”, “javascript”)
脚本对象.方法 (“AddCode”, “function a(){return(new Date().getTime());}function js_escape(pam_escape){return(escape(pam_escape));}function js_encodeURIComponent(pam_encodeURIComponent){return(encodeURIComponent(pam_encodeURIComponent));}function js_time(){return(new Date().getTime());}”)
信息框 (脚本对象.通用方法 (“run”, “js_escape”, “我”).取文本 (), 0, )
信息框 (脚本对象.通用方法 (“run”, “js_encodeURIComponent”, “我”).取文本 (), 0, )
信息框 (到文本 (脚本对象.通用方法 (“run”, “js_time”).取数值 ()), 0, )
阅读权限30
在线时间 小时
升级&&0.5%当前用户组为 易语言学徒当前积分为 101, 升到下一级还需要 199 点。签到天数: 5 天结帖率: (1/2)
膜拜一下贴
阅读权限70
在线时间 小时
升级&&18.2%当前用户组为 易语言起步当前积分为 591, 升到下一级还需要 409 点。签到天数: 7 天结帖率: (1/1)
我表示没看懂。
阅读权限20
在线时间 小时
升级&&50%当前用户组为 易语言菜鸟当前积分为 75, 升到下一级还需要 25 点。
我表示没看懂。。
阅读权限50
在线时间 小时
升级&&28.5%当前用户组为 易语言入门当前积分为 357, 升到下一级还需要 143 点。结帖率: (1/3)
好东西。。。
阅读权限50
在线时间 小时
升级&&28%当前用户组为 易语言入门当前积分为 356, 升到下一级还需要 144 点。结帖率: (34/35)
学习了!!!!!!!!!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
Powered by本文不是基于B/S的 后台调用前台js方法,而是给你一段js方法字符串,让你在程序中直接解析这段方法,并调用方法得到想要的值。 & 首先要解析Js方法,可以用微软的msscript.ocx控件(Interop.MSScriptControl.dll)来解析js方法. 1.msscript.ocx下载的地址&&
& && 或者 2.项目中引用 msscript.ocx 或者 Interop.MSScriptControl.dll & 现在通过控件的一些方法可以解析js方法,并调用js方法返回值。 & 不过这儿可以将控件类的一些属性和方法封装成单独的类,方便自己调用。& 封装成ScriptEngine类。 & using Susing MSScriptCusing System.T//导入js文件,导入js 方法字符串,然后执行js方法。 通过msscript.ocx控件执行JS脚本 ,先引用
Interop.MSScriptControl.dll//官网下载: 然后
引用 xxx.ocx就行了
/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-BCEEF907033namespace csharp中执行js方法{
class script_run
/// &summary&
/// 脚本类型
/// &/summary&
public enum ScriptLanguage
/// &summary&
/// JScript脚本语言
/// &/summary&
/// &summary&
/// VBscript脚本语言
/// &/summary&
/// &summary&
/// JavaScript脚本语言
/// &/summary&
JavaScript
/// &summary&
/// 脚本运行错误代理
/// &/summary&
public delegate void RunErrorHandler();
/// &summary&
/// 脚本运行超时代理
/// &/summary&
public delegate void RunTimeoutHandler();
/// &summary&
/// ScriptEngine类
/// &/summary&
public class ScriptEngine
private ScriptC
/// &summary&
/// 定义脚本运行错误事件
/// &/summary&
public event RunErrorHandler RunE
/// &summary&
/// 定义脚本运行超时事件
/// &/summary&
public event RunTimeoutHandler RunT
/// &summary&
///构造函数 默认为 VBscript 脚本类型
/// &/summary&
public ScriptEngine()
: this(ScriptLanguage.VBscript)
/// &summary&
/// 构造函数
/// &/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(OnError);
((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(OnTimeout);
/// &summary&
/// 运行Eval方法
/// &/summary&
/// &param name="expression"&表达式&/param&
/// &param name="codeBody"&函数体&/param&
/// &returns&返回值object&/returns&
public object Eval(string expression, string codeBody)
msc.AddCode(codeBody);
return msc.Eval(expression);
/// &summary&
/// 运行Eval方法
/// &/summary&
/// &param name="language"&脚本语言&/param&
/// &param name="expression"&表达式&/param&
/// &param name="codeBody"&函数体&/param&
/// &returns&返回值object&/returns&
public object Eval(ScriptLanguage language, string expression, string codeBody)
if (this.Language != language)
this.Language =
return Eval(expression, codeBody);
/// &summary&
/// 运行Run方法
/// &/summary&
/// &param name="mainFunctionName"&入口函数名称 例如:add&/param&
/// &param name="parameters"&参数:例如:new object(){"",""}&/param&
/// &param name="codeBody"&函数体 例如:fucniton add(int a,int b){return a+b;}&/param&
/// &returns&返回值object:获取object.Tostring()&/returns&
public object Run(string mainFunctionName, object[] parameters, string codeBody)
this.msc.AddCode(codeBody);
return msc.Run(mainFunctionName,
parameters);
/// &summary&
/// 运行Run方法
/// &/summary&
/// &param name="language"&脚本语言&/param&
/// &param name="mainFunctionName"&入口函数名称&/param&
/// &param name="parameters"&参数&/param&
/// &param name="codeBody"&函数体&/param&
/// &returns&返回值object&/returns&
public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)
if (this.Language != language)
this.Language =
return Run(mainFunctionName, parameters, codeBody);
/// &summary&
/// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象
/// &/summary&
public void Reset()
this.msc.Reset();
/// &summary&
/// 获取或设置脚本语言
/// &/summary&
public ScriptLanguage Language
get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
set { this.msc.Language = value.ToString(); }
/// &summary&
/// 获取或设置脚本执行时间,单位为毫秒
/// &/summary&
public int Timeout
get { return 0; }
/// &summary&
/// 设置是否显示用户界面元素
/// &/summary&
public bool AllowUI
get { return this.msc.AllowUI; }
set { this.msc.AllowUI = value; }
/// &summary&
/// 宿主应用程序是否有保密性要求
/// &/summary&
public bool UseSafeSubset
get { return this.msc.UseSafeS }
set { this.msc.UseSafeSubset = true; }
/// &summary&
/// RunError事件激发
/// &/summary&
private void OnError()
if (RunError != null)
RunError();
/// &summary&
/// OnTimeout事件激发
/// &/summary&
private void OnTimeout()
if (RunTimeout != null)
RunTimeout();
开始解析js方法。
假如有个js方法:& function& add(var a){return a+1;}
通过上面的ScriptEngine类调用 js:add 方法
*********************************************************************
//声明是Javascript方法
script_run.ScriptEngine myScript = new script_run.ScriptEngine(script_run.ScriptLanguage.JavaScript);&
//js字符串
string& javascriptString=”function add(var a){return a+1;} function test(){}”; object jsmethodRunValue = myScript.Run("add", new object[] {“3”}, javascriptString); Console.WriteLine(jsmethodRunValue.ToString());
Console.ReadLine();
*********************************************************************************
本博客为水墨原创,基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的水墨(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。1287人阅读
(微软脚本引擎)
到微软的网站上,它是一个ActiveX(R)
控件,所以在.NET中使用我Interop了一下。下载安装完成后,新建一个C#的Windows应用程序项目,在解决方案资源管理器中选中引用节点,右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取msscript.ocx文件确定。那么在引用节点下会增加一个MSScriptControl组件,下面是他Interop后的所有对象。
ScriptControl 对支持 ActiveX(TM) Script 的宿主 Script 引擎提供简单接口。接下来我们对被转化成ScriptControlClass类的ScriptControl的属性和方法进行一些说明。
应用于 ScriptControl 本身或 Scirpt 引擎显示的用户界面元素,可读写。
CodeObject
返回对象,该对象用于调用指定模块的公用成员。只读。
返回 Error 对象,其中包含所发生的最后一个错误的相关详细信息。只读。
设置或返回正在使用的 Script 语言名称。可读写。
为 ScriptControl 对象返回模块集合。只读。
Procedures
返回在指定模块中定义的过程集合。只读。
设置或返回窗口的 hWnd,通过执行 Script 代码,此窗口用于显示对话框和其他用户界面元素。可读写。
设置或返回 ScriptControl 对象的模式。可读写
设置或返回时间(毫秒),此时间后用户可选择中止 Script 代码的执行或允许代码继续执行。可读写。
UseSafeSubset
设置或返回 Boolean 值,指明宿主应用程序是否有保密性要求。如果宿主应用程序需要安全控制,则 UseSafeSubset 为 True,否则为 False。可读写。
向模块添加指定代码。可多次调用 AddCode 方法
使主机对象模型对 Script 引擎可用
计算表达式并返回结果
ExecuteStatement
执行指定的语句
放弃所有已经添加到 ScriptControl 中的 Script 代码和对象
运行指定过程
出现运行时错误时,发生此事件
当超出了 Timeout 属性指定的时间且用户在结果对话框中选定了 End 时,发生此事件
AllowUI&属性如果设置为False,则显示对话框之类的语句不起作用,如在 VBScript 中MsgBox&语句,JavaScript中的alert等,并且如果执行的脚本超出TimeOut设置的毫秒数,也不会跳出超出时间提醒的对话框,反之则相反;重新设
置&Language&属性会清空AddCode加载的代码;对于TimeOut属性,发生超时时,ScriptControl 检查对象的&AllowUI&属性,确定是否允许显示用户界面元素。
为了使控件更容易使用,用ScriptEngine类封装一下,下面是完整代码:
using MSScriptC
using System.T
namespace LCS.Web
/// &summary&
/// 脚本类型
/// &/summary&
public enum ScriptLanguage
/// &summary&
/// JScript脚本语言
/// &/summary&
/// &summary&
/// VBscript脚本语言
/// &/summary&
/// &summary&
/// JavaScript脚本语言
/// &/summary&
JavaScript
/// &summary&
/// 脚本运行错误代理
/// &/summary&
public delegate void RunErrorHandler();
/// &summary&
/// 脚本运行超时代理
/// &/summary&
public delegate void RunTimeoutHandler();
/// &summary&
/// ScriptEngine类
/// &/summary&
public class ScriptEngine
private ScriptC
/// &summary&
/// 定义脚本运行错误事件
/// &/summary&
public event RunErrorHandler RunE
/// &summary&
/// 定义脚本运行超时事件
/// &/summary&
public event RunTimeoutHandler RunT
/// &summary&
///构造函数 默认为 VBscript 脚本类型
/// &/summary&
public ScriptEngine()
: this(ScriptLanguage.VBscript)
/// &summary&
/// 构造函数
/// &/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(OnError);
((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(OnTimeout);
/// &summary&
/// 运行Eval方法
/// &/summary&
/// &param name=&expression&&表达式&/param&
/// &param name=&codeBody&&函数体&/param&
/// &returns&返回值object&/returns&
public object Eval(string expression, string codeBody)
msc.AddCode(codeBody);
return msc.Eval(expression);
/// &summary&
/// 运行Eval方法
/// &/summary&
/// &param name=&language&&脚本语言&/param&
/// &param name=&expression&&表达式&/param&
/// &param name=&codeBody&&函数体&/param&
/// &returns&返回值object&/returns&
public object Eval(ScriptLanguage language, string expression, string codeBody)
if (this.Language != language)
this.Language =
return Eval(expression, codeBody);
/// &summary&
/// 运行Run方法
/// &/summary&
/// &param name=&mainFunctionName&&入口函数名称&/param&
/// &param name=&parameters&&参数&/param&
/// &param name=&codeBody&&函数体&/param&
/// &returns&返回值object&/returns&
public object Run(string mainFunctionName, object[] parameters, string codeBody)
this.msc.AddCode(codeBody);
return msc.Run(mainFunctionName,ref parameters);
/// &summary&
/// 运行Run方法
/// &/summary&
/// &param name=&language&&脚本语言&/param&
/// &param name=&mainFunctionName&&入口函数名称&/param&
/// &param name=&parameters&&参数&/param&
/// &param name=&codeBody&&函数体&/param&
/// &returns&返回值object&/returns&
public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)
if (this.Language != language)
this.Language =
return Run(mainFunctionName, parameters, codeBody);
/// &summary&
/// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象
/// &/summary&
public void Reset()
this.msc.Reset();
/// &summary&
/// 获取或设置脚本语言
/// &/summary&
public ScriptLanguage Language
get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
set { this.msc.Language = value.ToString(); }
/// &summary&
/// 获取或设置脚本执行时间,单位为毫秒
/// &/summary&
public int Timeout
get { return 0; }
/// &summary&
/// 设置是否显示用户界面元素
/// &/summary&
public bool AllowUI
get { return this.msc.AllowUI; }
set { this.msc.AllowUI = }
/// &summary&
/// 宿主应用程序是否有保密性要求
/// &/summary&
public bool UseSafeSubset
get { return this.msc.UseSafeS }
set { this.msc.UseSafeSubset = true; }
/// &summary&
/// RunError事件激发
/// &/summary&
private void OnError()
if (RunError != null)
RunError();
/// &summary&
/// OnTimeout事件激发
/// &/summary&
private void OnTimeout()
if (RunTimeout != null)
RunTimeout();
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:396505次
积分:4523
积分:4523
排名:第2806名
原创:17篇
转载:350篇
评论:26条
(1)(1)(3)(24)(3)(20)(3)(23)(34)(1)(2)(15)(31)(56)(8)(25)(29)(33)(41)(1)(9)(1)(1)(1)(2)【转】VB控件和对象:ScriptControl 控件 - 笑笑小白 - 博客园
归类自己需要的资料,慢慢爬行
3. ScriptControl 控件
&&& Microsoft Script Control 控件可以创建运行任何 ActiveX(R) scripting 引擎,例如 Microsoft(R) Visual Basic (R) Scripting Edition 或Microsoft(R) JScript(TM) 的应用程序。简单的的说,可以在程序运行期间,允许用户编写代码并执行代码,计算带变量的的表达式等。
&&& ■运行时设置程序代码:&&& '▲显式创建,勾选引用(不选部件) Microsoft Script Control&&& Private Sub Command1_Click()&&&&&& Dim strProgram As String, sc As ScriptControl&&&&&& '编写代码&&&&&& strProgram = "Sub My1" & vbCrLf & _&&& "MsgBox ""运行时设置代码"" ,vbInformation,""我的代码""" & vbCrLf & _&&& "End Sub"&&&&&& '设置代码语言,并将代码添加到 ScriptControl&&&&&& Set sc = CreateObject("ScriptControl")&&&&&& sc.Language = "VBScript"&&&&&& sc.AddCode strProgram&&&&&& '运行代码&&&&&& sc.Run "My1"&&& End Sub&&& '▲隐式创建,不勾选部件和应用&&& Private Sub Command1_Click()&&&&&& Dim strProgram As String, sc&&&&&& '编写代码&&&&&& strProgram = "Sub My1" & vbCrLf & _&&& "MsgBox ""运行时设置代码"" ,vbInformation,""我的代码""" & vbCrLf & _&&& "End Sub"&&&&&& '设置代码语言,并将代码添加到 ScriptControl&&&&&& Set sc = CreateObject("ScriptControl")&&&&&& sc.Language = "VBScript"&&&&&& sc.AddCode strProgram&&&&&& '运行代码&&&&&& sc.Run "My1"&&& End Sub&&& '▲使用控件,勾选部件 Microsoft Script Control,并向窗体添加控件 ScriptControl1&&& Private Sub Command1_Click()&&&&&& Dim strProgram As String&&&&&& '编写代码&&&&&& strProgram = "Sub My1" & vbCrLf & _&&& "MsgBox ""运行时设置代码"" ,vbInformation,""我的代码""" & vbCrLf & _&&& "End Sub"&&&&&& '设置代码语言,并将代码添加到 ScriptControl&&&&&& ScriptControl1.Language = "VBScript"&&&&&& ScriptControl1.AddCode strProgram&&&&&& '运行代码&&&&&& ScriptControl1.Run "My1"&&& End Sub
■Script的模块与过程&&& '▲添加一个模块,默认只有一个模块:Global&&&&&& ScriptControl1.Modules.Add "Modu2"&&& '▲在模块 1 中添加过程代码,&&& '注意 Script 变量定义不能指定类型, dim a as long 会出错&&&&&& nStr="dim a" & vbCrLf & _&&& "Function MyFun(x,y)" & vbCrLf & _&&& "&& a=a+1 " & vbCrLf & _&&& "&& MsgBox ""a="" & a & "" x+y="" & x+y,vbInformation,""运行时设置代码""" & vbCrLf & _&&& "&& My1=a" & vbCrLf & _&&& "End Function"&&&&&& ScriptControl1.Modules(1).AddCode nStr&&& '▲调用有返回值的函数&&&&&& d = ScriptControl1.Modules(1).Run(MyFun, 1, 2) '运行代码&&& '▲列出所有模块名称&&&&&& Dim I As Long&&&&&& List1.Clear&&&&&& For I = 1 To ScriptControl1.Modules.Count&&&&&&&&& List1.AddItem ScriptControl1.Modules(I).Name&&&&&& Next&&& '▲列出模块 M 的所有过程名称&&&&&& Dim I As Long,M as long&&&&&& List2.Clear&&&&&& M=1&&&&&& For I = 1 To ctSc.Modules(M).Procedures.Count&&&&&&&&& List2.AddItem ctSc.Modules(M).Procedures(I).Name&&&&&& Next&&& End Sub
■计算带变量的表达式&&& Private Sub Command1_Click()&&&&& '执行一条 scripting 语句例子&&&&&& x = 10&&&&&& ScriptControl1.ExecuteStatement "x=" & x '执行一条 scripting 语句,将值 10 赋给变量 x&&&&&& S = ScriptControl1.Eval("(x-1)^2")&&&&&& MsgBox S&&& End Sub
■错误通告&&&& Private Function ErrInf() As String&&&&&& ErrInf = ScriptControl1.Language & " 语法错误:行 " & ScriptControl1.Error.Line & ",列 " & ScriptControl1.Error.Column & vbCrLf & vbCrLf & _&&& "错误号:" & ScriptControl1.Error.Number & "," & ScriptControl1.Error.Description&&& End Function
■ScriptControl 控件的语句使用 VBScript 语法,
随笔 - 191}

我要回帖

更多关于 窗体控件对象设置不对 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信