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脚本语言应用 的相关文章

  • 从命令行增加 Delphi XE 项目版本号

    我有一个 Delphi XE 项目 我试图在使用 MSBuild 构建它之前更改程序的版本号 版本号信息位于 DPROJ 文件中 但如果我更改这些值 版本号不会更改 我认为原因是当您在 IDE 中更改版本号时 Delphi 会将更改保存到
  • 如何在以管理员身份运行模式下部署应用程序?

    如何部署应用程序 使其需要管理员权限 而无需最终用户手动执行此操作 我使用 Delphi 2009 来构建该应用程序 您可以使用以下命令通知 Windows 您的应用程序需要以管理员身份运行requestedExecutionLevel应用
  • 在 Delphi 中,我的 DLL 中是否必须分配函数的返回 pchar

    我有一个 DLL 其中有一个返回 pchar 的函数 以避免必须使用 borlndmm 我最初所做的是将字符串转换为 pchar 并返回 Result pChar SomeFuncThatReturnsString 但 90 的情况下我都能
  • 如何解决内存分段并强制FastMM释放内存给OS?

    注意 32 位应用程序不计划迁移到 64 位 我正在使用一个非常消耗内存的应用程序 并且几乎优化了与内存分配 取消分配相关的所有相关路径 应用程序本身没有内存泄漏 没有句柄泄漏 没有任何其他类型的泄漏 据我所知并经过测试 我无法触及的第 3
  • delphi检查ini文件是否存在

    如何检查 INI 文件是否存在 在特定路径和特定名称下 比如这样 if FileExists c yourinifile ini then ShowMessage c yourinifile ini exists
  • Delphi - 如何将通用参数传递给接受 const 参数数组的函数

    我有一个 基类 其中包含一个 函数 该函数接受 const 数组 类型的参数 如下所示 type TBaseClass class TObject public procedure NotifyAll const AParams array
  • 是否有适用于 >= Delphi 2007 的 Delphi 混淆器

    我曾经使用 Pythia 来混淆我的 D6 程序 但 Pythia 似乎不再适用于我的 D2007 这是 Pythia 的链接 自 2007 年初以来没有更新 http www the interweb com serendipity in
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • Delphi - 通过 ADO 查询获取 Excel 行

    我有以下 Excel 文件 我将 AdoConnection ConnectionString 设置为 AdoConnection ConnectionString Provider Microsoft Jet OLEDB 4 0 Data
  • 为什么我不能在接收数组参数的函数中使用 SetLength?

    我正在尝试使用以下函数来设置动态数组 即 var 参数 的长度 当我尝试编译代码时只有一个错误 dcc64 错误 lolcode dpr 138 E2008 不兼容类型 function execute var command array
  • Delphi错误数据集未处于插入或编辑模式

    客观的 单击 TRxDBCombo 上的按钮调用搜索框 从搜索框中选择记录时 结果将设置为 TComboEditBox 的字段值 并发布在 TRxMemoryData 数据集中 错误 第二次调用此函数时出现数据集未处于插入或编辑模式 TDB
  • ComboBox.Sorted 发生了什么:= True;在德尔福 10.2 中?

    最近我的最后一个问题获得了 风滚草 徽章 我不确定是否应该问更多问题 但这里是 我正在填充一个TComboBox使用 sqlite 表中的项目 效果很好 在我以前的 Delphi 版本中 我能够使用ComboBox1 Sorted True
  • 如何更改 Chromium 组件的默认背景颜色?

    I use TChromium http code google com p delphichromiumembedded 我分配AWebPageAsString这是一个带有灰色背景颜色的静态 HTML 页面 FBrowser TChrom
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 如何在 Vista 上安装 Delphi 7

    我多次尝试在 Vista 上安装 Delphi 7 但 Vista 告诉我此应用程序 Delphi 7 存在已知问题 从而阻止了我这样做 我公司的其他几个人在 Vista 上安装 D7 时遇到了问题 由此得出的结论是 我们的 D7 应用程序
  • 如何在 OSX 上的应用程序名称下创建子项菜单?

    如何在下面添加TMenuItemProject1以上Quit在下面的屏幕截图上 我创建了一个 TMenuBar 并选中了 UseOSMenu 属性 我添加的第一个 TMenuItem 是主栏中的第二个 TMenuItem 您可以通过将 II
  • Delphi线程死锁

    我有时会在销毁某些线程时遇到死锁问题 我尝试过调试该问题 但在 IDE 中调试时似乎从未存在死锁 可能是因为 IDE 中的事件速度较低 问题 当应用程序启动时 主线程会创建多个线程 线程始终处于活动状态并与主线程同步 完全没有问题 当应用程
  • 有人用CrossKylix进行真正的跨平台开发吗?

    新版本克罗斯凯利克斯 http crosskylix untergrund net 两周前更新过 即使 Kylix 已经停产很久了 但它似乎仍然被一些 Delphi 开发人员使用 有人在 Windows 和 Linux 的跨平台开发中成功使
  • 处理 TShellListView 后代中的文件放置

    我正在尝试创建 TShellListView 的后代 它接受从 Windows 资源管理器中删除的文件 我想在组件定义中处理拖 放操作 而不必在任何使用该组件的应用程序中实现它 我找到了接受从 Windows 资源管理器中拖放的文件的示例
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以

随机推荐

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

    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脚