Delphi中的集成VBS脚本语言应用

2023-05-16

罗焱 从薇 王正浩


摘 要:使用ActiveX Scripting技术,可以在应用程序中集成使用脚本语言。本文介绍如何应用这一技术在Delphi应用程序中添加VBScript支持。
关键词:ActiveX脚本描述;Delphi;VBScript

1.引言
  Delphi语言是Borland公司开发的一种功能强大的编程语言,它基于串口和面向对象,并兼有VC的强大功能和VB的快速开发、易学易用的优点,具有开发效率高、界面制作美观方便、可实现各种操作功能等特点。VBS全称Visual Basic Script,是一种简单易学,功能强大的脚本语言,应用极为广泛。
本文介绍了通过ActiveX Scripting技术在Delphi中调用和操作VBS的方法,实现了Delphi和VBS的混合编程,充分发挥了两者各自的优势。

2.基本原理
2.1 ActiveX技术的基本概念
在Delphi中无法直接调用VBS,而利用ActiveX技术可以解决这个问题。ActiveX是Microsoft公司于1996年提出的一项技术,它以COM(Component Object Model,组件对象模型)为基础,使得不同的进程(特别是网络进程)之间可以相互通信。ActiveX控件是Microsoft公司提供的一种用于模块集成的协议,是可移植的软件模块,适用于各种开发语言,因而与开发平台无关。ActiveX控件由一些遵循ActiveX规范的可执行代码组成,比如一个.exe,.dll或.ocx文件。在程序中加入ActiveX控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。ActiveX控件保留了一些普通Delphi控件的属性、事件和方法,其特有的方法和属性大大地增强了程序设计者的能力和灵活性。
2.2 ActiveX脚本描述(ActiveX Scripting)
使用ActiveX技术中的ActiveX脚本描述(ActiveX Scripting)技术,可以从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。
ActiveX Scripting体系由一个COM接口族组成,这些接口定义了一个把脚本引擎和宿主程序连接起来的协议。在ActiveX Scripting的世界里,脚本引擎只是一个组件对象,它能够动态地执行脚本程序。宿主应用程序可以将它的Automation接口暴露在脚本引擎的名字空间中,可在动态执行的脚本中像访问程序中的变量那样访问应用程序的对象。
应用程序根据要解析的Script语言来创建和初始化脚本引擎,然后把应用程序连接在引擎上。然后把脚本代码提交给脚本引擎,脚本代码就可以执行了。
  ActiveX Scripting利用WSH,即Windows Scripting Host来做为脚本语言的工作环境。WSH是在系统内植入的一个基于32位Windows平台、并独立于语言的脚本运行环境,WSH架构于ActiveX之上,通过充当ActiveX的脚本引擎控制器为Windows用户充分利用威力强大的脚本指令语言扫清了障碍。

3.调用VBS在Delphi中的实现
  要在Delphi中调用VBS首先需要在DELPHI集成环境中安装ActiveX控件。
  要导入Activex控件,先选中Delphi菜单中的Component,选择导入ActiveX控制,安装Microsoft Script Control,就在Delphi环境中安装了ActiveX控件,然后在程序代码中加上这样一句:use MSScriptControl_TLB就可以调用VBS代码了。
  代码其余部分参见下列代码示范:
 l_ScriptControl:=TScriptControl.Create(nil); //创建Script控制对象
l_ScriptControl.AllowUI:=True;
l_ScriptControl.Language:='VBScript'; //确定Script语言
v := VarArrayCreate([0, 0], varVariant);
v[0] := InputVarArrays;
Params: = PSafeArray(TVarData(v).VArray);
l_scriptCode:=Tstringlist.Create;
try
l_scriptCode.LoadFromFile(VBScript_filename+'.vbs'); //导入VBS文件程序
if l_scriptCode.Count=0 then exit;
l_ScriptControl.AddCode(l_scriptCode.Text);
result:=l_ScriptControl.Run(VBScript_filename, Params); //运行VBS程序
finally
l_ScriptControl.Free; //最后释放所有的VBS对象
l_scriptCode.Free;
end;
  这样就可以成功的调用一个VBS程序进行所需的操作了。但这只是做了最基本的操作,离实际的需求还有一段距离。比如说如果希望为了提高代码重用性和效率,可以使用事先写好的一些公用VBS函数,如一些基本数学函数。但是上面的例子只能调用一个VBS文件,文件名即函数名,有极大的局限性。
为了解决上面的问题,有相应的解决办法。如下面的程序所示:
……//循环检查要装入的VBS文件是否存在
l_scriptCode:=Tstringlist.Create;
l_ScriptControl:=TScriptControl.Create(nil);
try
l_ScriptControl.AllowUI:=True;
l_ScriptControl.Language:=L_VBScript;
v := VarArrayCreate([0,0], varVariant);
v[0] := InputVarArrays;
Params: = PSafeArray (TVarData(v).VArray);
//循环装入需要的VBS文件,并检查文件代码是否为空
for l_i := 0 to VBScript_filenames.Count-1 do
begin
l_scriptCode.LoadFromFile(VBScript_filenames.Strings[l_i] +’.vbs’);
if l_scriptCode.Count=0 then exit;
l_ScriptControl.AddCode(l_scriptCode.Text);
end;
//正常调用VBS程序
 OutputDataSets :=l_ScriptControl.Run(VBScript_filenames.Strings[0],Params);
finally
l_ScriptControl.Free;
l_scriptCode.Free;
end;
  来比较一下两段程序的不同,首先是第二个程序可以载入多个文件,其中第一个文件与要执行的主函数同名,其余的文件包含了该主函数可能会调用的一些基本函数,为此还增加了检查函数文件及其代码的工作。
  这样就可以很轻松的使用事先写好的一些程序,象搭积木一样,让用户不必学习深奥的编程知识,有熟练的编程技巧,就可以轻松使用VBS进行自己想要的操作。同时遇到以后功能扩展的需要,也可以编写符合要求的VBS函数进行我们需要的操作了。
4.总结
随着计算机和信息技术的不断发展,计算机的软件应用变得越来越普遍,但是要设计适应要求的通用型软件还是有很大的难度。本文介绍了利用Active Scripting技术在Delphi中集成使用VBS的方法,目的就是为了利用脚本语言为应用程序提供二次编程的能力,从而大大的提高软件的适用性。Delphi和VBScript都是非常强大的开发工具,如果能够很好地把它们结合起来,相信能够开发出越来越多功能强大、适用性强的商业软件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi中的集成VBS脚本语言应用 的相关文章

  • 在网格上拖动时拖动图像更改

    我正在 StartDrag 上创建自定义 DragObject 的实例 procedure TForm1 GridStartDrag Sender TObject var DragObject TDragObject begin DragO
  • Delphi 2005 Web 服务问题

    我在尝试通过 Delphi 访问 Web 服务时遇到问题 我使用了 2007 版 WSDLimp 工具的 java WSDL 看起来它已正确创建了所有对象 然而 当我制作一个调用该服务的测试程序时 每个对象都是空的 如果我在 HTTPRIO
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • Windows 更新后 Active 设置为 False 时 TIdHttpServer 冻结

    我们有一个 Indy 版本 10 6 1 5235 TIdHttpServer 服务 多年来一直与 Delphi 2007 配合良好 在最新的 Windows 更新 KB4338815 和 KB4338830 之后 我们注意到当 TIdHt
  • Android中如何检测程序的终止?

    当 Windows 程序终止时 它会调用事件处理程序 例如 OnClose OnDestroy 和析构函数 Destroy 当我想保存一些 INI 设置时 这些地方就是我要保存的地方 我为所有这些事件编写了事件处理程序 但当我终止程序时它们
  • VirtualStringTree 正确/推荐使用

    我已经使用 virtualstringtree 一段时间了 我将它用于两个不同的用途 第一个是用于选择 显示数据的普通树 第二个是作为网格来显示 SQL 语句的输出 我加载到树中的所有数据都来自数据库 对于树示例 我有一个 ParentId
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • “已发布集 '%s' 的大小大于 4 字节”。如何修复这个编译器错误?

    我有一组包含 138 个值的枚举值 就像是 type TSomething sOne sTwo sThree sOnehundredAndThirtyeight TSomethings set of TSomething TSomethin
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • delphi专家中的第三方依赖

    我正在编写一个delphi ide Expert 带有一些第三方依赖项 视觉控件 我的问题是当这个专家将安装在目标机器上时 这台电脑是否也需要安装这些第三方组件 或者组件是embeded在生成的 bpl 内部 它们将依赖于您放置在包的 re
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • 在 Inno Setup 中使用 StringToColor

    我想为表单上的标签 TNewStaticText 属性颜色 TColor 读写 分配一些颜色 我将颜色存储为 RRGGBB 字符串 我想使用 Delphi 函数 StringToColor 将其转换为 TColor 但如果我在脚本中使用此函
  • 为什么我不能在接收数组参数的函数中使用 SetLength?

    我正在尝试使用以下函数来设置动态数组 即 var 参数 的长度 当我尝试编译代码时只有一个错误 dcc64 错误 lolcode dpr 138 E2008 不兼容类型 function execute var command array
  • 创建FileStream时如何处理异常

    我有一个这样的函数 我想重构它 function Myfunction sUrl sFile String Boolean var GetData TFileStream begin Result False if the line bel
  • ComboBox.Sorted 发生了什么:= True;在德尔福 10.2 中?

    最近我的最后一个问题获得了 风滚草 徽章 我不确定是否应该问更多问题 但这里是 我正在填充一个TComboBox使用 sqlite 表中的项目 效果很好 在我以前的 Delphi 版本中 我能够使用ComboBox1 Sorted True
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议

随机推荐

  • 【单片机竞赛:共阳数码管静态控制】

    51单片机 xff08 国信天长单片机实训平台 xff09 基于keli的常用程序之 共阳数码管一般静态控制程序设计 文章目录 51单片机 xff08 国信天长单片机实训平台 xff09 基于keli的常用程序之 共阳数码管一般静态控制程序
  • Linux - 搭建LDAP统一认证服务

    目的 通过以下步骤最终可使用ldap server中的用户登录一台ldap client xff0c 并允许有sudo权限 平常公司中所用的域账号以及服务器账号也许就是使用如下方式 xff0c 但是应该没有这么简陋 xff0c 只是借机了解
  • 每日练习------有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

    题目 有n个整数 xff0c 使其前面各数顺序向后移m个位置 xff0c 最后m个数变成最前面的m个数 解题关键 需要新建个数组使得原数组可以做到整体往后移动M位 思路 1 创建个有n个整数的数组 2 输出n个数字 存储到数组中 3 遍历原
  • FLTK-Rs

    终于还是到这一步了 xff0c 可视化 xff0c 我的超人 xff01 FLTK是一个跨平台的轻量级 gui 库 该库本身是用 C 43 43 98 编写的 xff0c 具有很高的可移植性 fltk crate 是用 Rust 编写的 x
  • STM32寄存器点灯失败

    include 34 stm32f10x h 34 int main void unsigned int 0x40021018 61 1 lt lt 3 打开时钟GPIOB unsigned int 0x40010C00 61 1 lt l
  • nested exception is java.sql.SQLException: com.mysql.cj.jdbc.Driver

    解决方案 在 pom xml 中 xff0c 加入 mysql 的 maven 引用 span class token tag span class token tag span class token punctuation lt spa
  • iOS-开辟子线程(NSThread、NSOperationQueue、GCD)

    本节主要总结一些开辟子线程的常用的几种方法 一 通过NSThread类开辟子线程 1 NSThread手动开启子线程 span class hljs comment 创建线程对象 span span class hljs built in
  • iOS -UICollectionView添加区头区尾

    项目中需求时三个区 xff0c 没个区展示不同的数据 xff0c 一格一格的 xff0c 所以tableView是不是适用的 xff0c 需要采用collectionView才能更好的展示 xff0c 那么怎么给它添加区头区尾呢 xff1f
  • miui 安装app闪退问题

    android版本 xff1a 7 0 MIUI版本 xff1a 8 2 手机 xff1a 小米5 之前老版本可以运行 xff0c 今天用AS的run xff0c 在安装apk时报application installation faile
  • 在x64上构建智能家居(home assistant) (一) Supervised版本安装

    我的上一篇文章 在嵌入式x86上构建我的智能家居 home assistant 中本来希望在一个低功耗的x86嵌入式上安装home assistant xff0c 但是因为一些限制没有成功 找到一个低功耗的笔记本 xff08 东芝的dyna
  • 安装YMFE/yapi API管理服务器(Ubuntu20)

    GitHub YMFE yapi YApi 是一个可本地部署的 打通前后端及QA的 可视化的接口管理平台 YApi 是一个可本地部署的 打通前后端及QA的 可视化的接口管理平台 Contribute to YMFE yapi develop
  • 安装nodejs18 + yapi(Debian11)

    安装nodejs Node js Node js is a JavaScript runtime built on Chrome 39 s V8 JavaScript engine https nodejs org zh cn 官方手顺 通
  • Postgresql count 慢的处理方法

    performance Postgresql extremely slow count with index simple query Database Administrators Stack Exchange https dba sta
  • 解决Referenced file contains errors(struts-2.0.dtd)

    解决方法 两种 1 这个可能是你的DTD文件找不到 或者解析有错 才发生的错误 你可以在地址栏里输入http struts apache org dtds struts 2 0 dtd 这个看能查看不 如果不能 应该是网络的问题或XML解析
  • 使用POI向Excel中插入多张图片

    最近在大量使用poi对Excel进行操作 xff0c 可以说是越用越气愤 xff0c 很多功能支持得不完善 xff0c 一个在VB里很简单的操作 xff0c 你用poi实现可能就要多几倍甚至是数10倍的代码 但是我们搞JAVA的总不能丢掉J
  • 将“存储卡”改名为Storage Card的方法

    HKEY LOCAL MACHINE System StorageManager Profiles SDMemory 34 Name 34 61 34 SD Memory Card 34 34 Folder 34 61 34 Storage
  • ubuntu 驱动更新后导致无法进入界面

    问题描述 xff1a 安装新ubuntu系统后未禁止驱动更新导致无法进入登录界面 解决办法 xff1a 首先在进入BIOS中 xff0c 修改设置以进行命令行操作 xff0c 然后卸载已有的系统驱动 xff0c 最后安装新的驱动即可 开机按
  • PPC WM6.1智能手机上使用日语辞典浅谈

    在PPC手机上用日语辞典 xff08 広辞苑 xff0c 三省堂等 xff09 http bulo hjenglish com group topic 144804 PPC上的日文输入法 http bulo hjenglish com gr
  • PPC音量太小和听筒音太小的解决方法

    1下载注册表修改器 2复制修改器到PPC xff08 最好是卡上啦 xff09 3在PPC上运行修改器 我用的是华硕P525 以下是我小P的设置 xff1a 找到HKEY CURRENT USER ControlPanel Phone 项下
  • Delphi中的集成VBS脚本语言应用

    罗焱 从薇 王正浩 摘 要 xff1a 使用ActiveX Scripting技术 xff0c 可以在应用程序中集成使用脚本语言 本文介绍如何应用这一技术在Delphi应用程序中添加VBScript支持 关键词 xff1a ActiveX脚