分享
 
 
 

在VB编程中采用Windows脚本控件实现程序脚本化

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

作者: BUILDER.COM

Thursday, May 23 2002 11:26 AM

电子邮件脚本病毒在网络上泛滥成灾之后,作为脚本缺陷的始作俑者,WSH(Windows脚本主机)受到了广泛和强烈的抨击,不过,对应用程序开发人员而言,WSH仍然具备相当大的潜质和开发魅力。是的,脚本技术完全可能取代网络管理员对批处理文件的依赖,更时髦的脚本相信对那些“真正”的开发人员仍具相当的实用性。

比方说,你知道微软的Office套件如此流行的原因吗?其中之一就是所有的Office应用程序都包括了了简单的开发环境,稍有技术的用户都可以由此实现重复任务的自动化。VBA(Visual Basic for Applications)就为Office软件提供了这种环境,而且,如果你能承担微软要求的许可证费用,你还可以在你自己的应用程序中使用VBA。现在,我们再来看看WSH和Windows Script Control,它们是对VBA廉价而且相当有用的替代选择。为Visual Basic应用程序提供了自动的脚本化技术。

掌握脚本控件

Windows Script Control 把Active Scripting Engine封装在了非用户界面的ActiveX控件之内以方便VB编程的使用,而Active Scripting Engine正是WSH的核心。程序员可以利用该控件执行整个脚本或者脚本的片段,而这些脚本可以用WSH所支持的任何语言编写。也许你的计算机上已经安装了这种控件;它的名字是msscript.ocx,通常位于System32 目录下。否则你可以从微软网站下载。

Windows Script Control控件还包括了一些文档,但照我的经验看,这些文档有点不完整而且不太准确。掌握控件用法的最好方法就是具体应用它,通过具体应用了解其工作原理和用途。我自己就是这么做的,先创建了一个测试项目,用它来了解脚本控件的可能现象和用途,你可以从这里下载测试项目。这篇文章中会反复用到该测试项目。

运行脚本

为了运行用到脚本控件的脚本,你有以下若干选择:

Eval方法,它同VBA Eval函数类似,从简单算术到包含嵌入脚本的命令或对象方法调用的复杂表达式都可以计算,而且会把结果返回给你的应用程序。

ExecuteStatement方法执行任何完整的脚本语句。

联合运用AddCode和Run方法可以装载并执行定制的脚本程序。这也是功能性最强大的方法,同时也是本文余下部分要讨论的方法。

ScriptingDemo简介

ScriptingDemo应用程序由一个窗体、两个文本框组成,窗体显示应用程序所在目录下的脚本文件列表,一个文本框获取脚本程序所需要的参数,另一个文本框显示执行脚本的输出结果。在应用程序启动的时候,它实例化一个定制集合对象colCustomers,通过它从SQL Server的Northwind目录的Customers数据表装载数据供我们的示例脚本操作数据。应用程序在运行时显示的主窗体如图A所示。

图A

运行时的ScriptingDemo主窗体

在选择了一个脚本之间之后,应用软件逐行读取脚本代码并通过AddCode方法把它加到脚本控件的环境内。单击Run Script按钮之后脚本控件就会执行所选文件同名(不带扩展名)的程序。

以ASimpleScript.vbs为例。它包含以下的子程序:

Sub ASimpleScript()

MsgBox "Hello from VBScript!"

End Sub

选择该文件,然后单击Run Script按钮即产生图 B 所示的输出结果。

图B

运行ASimpleScript.vbs之后的结果

对,我承认这个程序太简单了,但它确实说明你在运行脚本,除此以外,我们还需要深入控件内部探个究竟。

同脚本共享数据

现在让我们更深入一步,看看隐藏在窗体Load事件(清单A.)之后的代码,代码中有以下两行:

ScriptControl1.AddObject "Customers", oCustomers, True

ScriptControl1.AddObject "Output", oScriptOutput, True

我们还没有谈论过AddObject。该方法把对对象的引用加到脚本控件的执行环境。用这种方式添加的对象可以受到控件所运行的所有脚本的全局访问,从而令脚本获得了访问应用程序所创建的对象的权限。同时这也是一种和应用程序通讯的方式。在这种情况下,我们就为主窗体装载Customers时创建的数据操作集合添加了引用,同时也对Output类如法炮制,它则给脚本赋予了对主窗体上的txtOutput只写的访问权限。

查看EnumCustomer脚本的代码可以从中了解这种方法的有用性,该脚本代码请见清单B。该脚本获取单个输入参数,该参数表示Customers集合内包含的客户索引,而该集合则是我们通过调用AddObject添加到脚本控件环境的。EnumCustomer脚本访问Customers集合并枚举出所选项目的所有可用字段,然后通过Output对象的txtOutput打印出结果。

有利就有弊

现在你的头脑里可能产生了这样一个问题:为什么要把txtOutput封装在类里而不是经由 AddObject为frmMain.txtOutput增加引用呢?UpdateCustomer.vbs的代码给出了答案:

Sub UpdateCustomer(num)

Output.PrintLine("Changing ")

Output.PrintLine(Customers(num).ContactName )

Output.PrintLine(" to Bob Hope")

Customers(num).ContactName = "Bob Hope"

End Sub

这个脚本修改了Customers集合中一个项目的内容,意味着脚本对经由AddObject被加到它们环境中的对象进行了读写操作。假如我允许有害脚本自由访问txtOutput的话它不也可以做同样的事吗:

txtOutput.Visible = false

当后续运行的脚本试图经由txtOutput与用户通讯时,这一行为就会出漏子了。虽然我无法创建成功改变全局对象实际引用的脚本(全局对象是通过AddObject增加的,比如Customers=Nothing),但是我也得承认这种行为也不是不可能的。因此,在访问脚本的时候就存在一个道德问题了。

用途广泛

脚本化的应用程序在最终用户定制和自动化领域具有显然的巨大作用。比方说,用脚本临时修补程序等。而且在某些应用程序事件发生的情况下可以运行脚本行使钩子功能。这样,你就可以通过简单地分派脚本纠正应用程序的错误而不是分派更新的二进制代码。定制报告和数据分析也能从中得益。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有