做过工控的人都知道,对脚本语言的支持是标准组态软件应具备的一个基本功能(如iFix,组态王等)。如果我们用VB开发类似的功能,能实现吗?

    想必大家都知道微软提供了Micrsoft Script Control 1.0 控件,在VB版也见到了大家对这个控件的使用(如用ExecuteStatement方法执行脚本命令 ExecuteStatement("msgbox “你好””)??? )。但最重要的一点,ActiveX脚本与宿主应用程序数据交互与传递,却没有完整的解决方案。

我也是探索了很长一段时间,才摸索出一点数据传递与交互的技巧,现在共享出来,供大家讨论研究。

示例程序介绍:

1、首先加载Micrsoft Script Control 1.0 控件。

对它基本上不用配置,默认语言VBScript,对该部分的介绍请下载VBScript命令集 (http://blog.csdn.net/yefanqiu   【叶帆资源】[03] VBScript指令集)

2、添加一个窗体(frmTest),里面添加如下代码:

'************************************************************************* '**模 块 名:frmTest '**说 明:YFsoft 版权所有2004 - 2005(C) '**创 建 人:叶帆 '**日 期:2004-10-15 11:00:32 '**修 改 人: '**日 期: '**描 述:脚本语言运用探索 '**版 本:V1.0.0 '************************************************************************* Option Explicit '************************************************************************* '**函 数 名:chkRun_Click '**输 入:无 '**输 出:无 '**功能描述:脚本运行控制 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 11:19:31 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub chkRun_Click() If chkRun.value = 1 Then tmrRun.Interval = cmbRunTime.Text '运行间隔 tmrRun.Enabled = True '开始运行 以固定间隔循环运行 txtEdit.Enabled = False Else tmrRun.Enabled = False '停止运行 txtEdit.Enabled = True End If End Sub '************************************************************************* '**函 数 名:cmbType_Click '**输 入:无 '**输 出:无 '**功能描述:操作类型切换 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 12:56:19 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub cmbType_Click() cmdSCDemo1_Click End Sub '************************************************************************* '**函 数 名:cmdRun_Click '**输 入:无 '**输 出:无 '**功能描述:单次运行脚本 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 11:51:29 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub cmdRun_Click() Call tmrRun_Timer End Sub '************************************************************************* '**函 数 名:cmdSCDemo1_Click '**输 入:无 '**输 出:无 '**功能描述:参数传递演示 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 11:03:29 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub cmdSCDemo1_Click() Dim strType As String '内部变量定义 类似组态王中的数据字典 valMem.Clear valMem.SetValue "Value1", txtValue(0) valMem.SetValue "Value2", txtValue(1) valMem.SetValue "Value3", 0 Select Case cmbType.ListIndex Case 0: strType = "+" Case 1: strType = "-" Case 2: strType = "*" Case 3: strType = "/" End Select txtEdit = "dim lngValue1" & vbCrLf txtEdit = txtEdit & "dim lngValue2" & vbCrLf txtEdit = txtEdit & "dim lngValue3" & vbCrLf txtEdit = txtEdit & "lngValue1=vm.getvalue(" & Chr(34) & "Value1" & Chr(34) & ")" & vbCrLf txtEdit = txtEdit & "lngValue2=vm.getvalue(" & Chr(34) & "Value2" & Chr(34) & ")" & vbCrLf txtEdit = txtEdit & "lngValue3=CInt(lngValue1)" & strType & "CInt(lngValue2)" & vbCrLf txtEdit = txtEdit & "vm.setvalue " & Chr(34) & "Value3" & Chr(34) & ",lngValue3 " & vbCrLf End Sub '************************************************************************* '**函 数 名:cmdSCDemo2_Click '**输 入:无 '**输 出:无 '**功能描述:对象操作演示 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 13:41:23 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub cmdSCDemo2_Click() txtEdit = "dim lngC" & vbCrLf txtEdit = txtEdit & "lngC=clng(fm.txtdemo.text)" & vbCrLf txtEdit = txtEdit & "lngC=lngC+10" & vbCrLf txtEdit = txtEdit & "if lngC>255 then lngC=0" & vbCrLf txtEdit = txtEdit & "fm.picdemo.backcolor=rgb(lngC,0,0)" & vbCrLf txtEdit = txtEdit & "fm.txtdemo.text=cstr(lngC)" & vbCrLf End Sub '************************************************************************* '**函 数 名:Form_Load '**输 入:无 '**输 出:无 '**功能描述:初始化 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 11:13:03 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub Form_Load() '添加参数运用的 内部可使用的变名 外部实际变量名 scCommand.AddObject "vm", valMem, True '向脚本添加外部可用的对象 '最后一个参数: True表示它的子类属性方法在脚本中可以操作 false 表示今该对象本身的方法属性可用 scCommand.AddObject "fm", Me, True '脚本运行间隔设置 cmbRunTime.ListIndex = 0 '参数操作类型 cmbType.ListIndex = 0 End Sub '************************************************************************* '**函 数 名:tmrRun_Timer '**输 入:无 '**输 出:无 '**功能描述:脚本运行 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 11:29:46 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Private Sub tmrRun_Timer() On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ Dim i As Long '参数输入 valMem.SetValue "Value1", txtValue(0).Text valMem.SetValue "Value2", txtValue(1).Text valMem.SetValue "Value3", 0 '脚本运行 scCommand.ExecuteStatement txtEdit.Text '参数输出 lstValueOut.Clear For i = 1 To valMem.Count lstValueOut.AddItem valMem.GetValue("", i) Next '------------------------------------------------ Exit Sub '---------------- ToExit: txtError = "错 误 号:" & Err.Number & " 时间:" & Format(Now, "YYYY-MM-DD HH:MM:SS") & vbCrLf txtError = txtError & "错误信息:" & Err.Description & vbCrLf txtError = txtError & "错误来源:" & Err.Source End Sub

3、添加一个模块(mdlBase),里面添加如下代码:

'************************************************************************* '**模 块 名:mdlBase '**说 明:YFsoft 版权所有2004 - 2005(C) '**创 建 人:叶帆 '**日 期:2004-10-15 11:10:58 '**修 改 人: '**日 期: '**描 述:公共变量区 '**版 本:V1.0.0 '************************************************************************* Option Explicit Public valMem As New clsScriptIO '脚本语言参数交换的变量设置区

4、添加一个类(clsScriptIO),类名为clsScriptIO,里面添加如下代码:

'************************************************************************* '**模 块 名:clsScriptIO '**说 明:YFsoft 版权所有2004 - 2005(C) '**创 建 人:叶帆 '**日 期:2004-10-15 11:56:32 '**修 改 人: '**日 期: '**描 述:与脚本语言参数交互的类模块 '**版 本:V1.0.0 '************************************************************************* Option Explicit Private cltScriptMem As New Collection '变量设置区 '************************************************************************* '**函 数 名:Count '**输 入:无 '**输 出:(Variant) - '**功能描述:内存变量个数 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 12:00:57 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Public Property Get Count() As Variant Count = cltScriptMem.Count End Property '************************************************************************* '**函 数 名:GetValue '**输 入:strKey(String) - 变量名称 '** :Optional lngNo(Long = 0) - 变量索引 '**输 出:(Variant) - 返回值 '**功能描述:取得制定名称的变量值 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 12:01:59 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Public Function GetValue(strKey As String, Optional lngNo As Long = 0) As Variant On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ If lngNo > 0 Then '如果输入索引号,则返回索引号指定的变量 GetValue = cltScriptMem.Item(lngNo) Else GetValue = cltScriptMem.Item(strKey) End If '------------------------------------------------ Exit Function '---------------- ToExit: End Function '************************************************************************* '**函 数 名:SetValue '**输 入:strKey(String) - 变量名 '** :value(Variant) - 设置变量 '**输 出:无 '**功能描述:为指定的变量赋值 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 12:07:05 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Public Sub SetValue(strKey As String, value As Variant) On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ cltScriptMem.Remove (strKey) cltScriptMem.Add value, strKey '------------------------------------------------ Exit Sub '---------------- ToExit: Resume Next End Sub '************************************************************************* '**函 数 名:DelValue '**输 入:strKey(String) - 变量名 '** :Optional lngNo(Long = 0) -索引号 '**输 出:无 '**功能描述:删除制定的变量 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 12:08:55 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Public Sub DelValue(strKey As String, Optional lngNo As Long = 0) On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ If lngNo > 0 Then '如果输入索引号,则删除索引号指定的变量 cltScriptMem.Remove (lngNo) Else cltScriptMem.Remove (strKey) End If '------------------------------------------------ Exit Sub '---------------- ToExit: End Sub '************************************************************************* '**函 数 名:Clear '**输 入:无 '**输 出:无 '**功能描述:删除变量 '**全局变量: '**调用模块: '**作 者:叶帆 '**日 期:2004-10-15 13:15:15 '**修 改 人: '**日 期: '**版 本:V1.0.0 '************************************************************************* Public Sub Clear() On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ While cltScriptMem.Count > 0 cltScriptMem.Remove (1) Wend '------------------------------------------------ Exit Sub '---------------- ToExit: Resume Next End Sub

  功能演示:

 

1、  参数传递(单击【传递参数演示】按钮,自动添加相应脚本代码。可以执行加减乘除等操作。

 

下图演示了错误捕捉(被0除错误)

 

 

2、对象操作(单击【对象操作演示】按钮,自动添加相应脚本代码。可以执行控件的赋值和背景色变化操作。

 

 

 

VBScript 使用 ActiveX(R)脚本与宿主应用程序对话。使用 ActiveX Script,浏览器和其他宿主应用程序不再需要每个脚本部件的特殊集成代码。ActiveX脚本使宿主可以编译 Script、获取和调用入口点及管理开发者可用的命名空间。通过 ActiveX Script,语言厂商可以建立标准脚本运行时语言。Microsoft 将提供 VBScript 的运行时支持。

VBScript脚本运用(脚本程序与宿主程序的交互)相关推荐

  1. VBScript之Windows 脚本宿主

    文章目录 1 WSH 的概念 1.1 脚本文件类型 1.2 使用 Windows 脚本宿主运行脚本 1.2.1 命令行执行 1.2.2 在 Windows 环境中执行 WSH 1.2.3 两种脚本区别 ...

  2. 插件架构学习体会(一) -- 宿主程序说:插件你得听我的

    看了一段时间的#develop,首先接触到的就是程序的插件架构.园子里也有许多不错的资料可以学习.随时把自己的认识写下来和大家交流,无疑会有很大帮助.闲话就不说了,进入正题.      说到插件架构, ...

  3. 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )

    文章目录 一.FFMPEG 源码下载 解压 二.交叉编译工具 三.configure 脚本及帮助命令 四.配置 configure 脚本 五.输出目录配置 六.函数库配置 七.程序配置选项 八.组件配 ...

  4. 【任务脚本】0530更新淘宝618活动领喵币脚本,OrangeJs基于autojs全自动程序稳定运行,向大神致敬...

       公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 0530:     更新一下文章内容,除了苹果手机用户最近没有收到其他手机不能 ...

  5. 【任务脚本】0528京东618叠蛋糕任务脚本全自动脚本,京东任务全自动程序稳定运行,向大神致敬...

       公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 0528: 用大神的脚本很多天了,除了前两天出现了个服务器问题,一直是无脑全自 ...

  6. 【任务脚本】0523更新京东618叠蛋糕任务脚本全自动脚本,大神更新了京东任务全自动程序...

       公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 0523:     大神OrangeJs大神更新了京东叠蛋糕任务脚本,第一时间 ...

  7. linux运行.pak文件,使用game-to-flatpak脚本将商业Linux游戏安装程序转换为Flatpak应用程序...

    现在有一个新的脚本,它允许你将各种商业Linux游戏的安装程序转换成可以在各种GNU/Linux发行版上运行的Flatpak软件包. 这是一个开源的shell脚本,由GNOME开发人员Bastien ...

  8. linux 脚本 杀进程,shell脚本实现杀死进程并启动程序(重启程序)【显哥出品,必为精品】...

    #!/bin/bash #取jms进程号 Das_ID=$(ps -ef |grep "python3 ./jms start" |grep -v "grep" ...

  9. Shell脚本,循环语句用于减少程序代码冗余和重复,for语句,while语句,使用let进行变量自增

    Shell脚本,循环语句用于减少程序代码冗余和重复,for语句,while语句 一.for语法: 1. for 变量 in 值列表 do 命令序列 done 例子:输出循环中的所有值 for i in ...

最新文章

  1. mongodb存储二进制数据的二种方式——binary bson或gridfs
  2. Python+selenium 自动化-滚动的使用方法,如何滚动到元素的位置
  3. sevlet3.0上传文件功能
  4. 基于HTML5的WebGL呈现A星算法的3D可视化
  5. 运维经验 清空大量日志
  6. 谈谈Hybird3D中的光栅化优化
  7. 阿里Java面试答案【283页PDF文档免费领】
  8. unity 动态生成类_Houdini城市道路模型生成
  9. 华为Mate30系列前面板曝光:双曲面刘海屏再获证实
  10. 电商美工需要的优质PSD素材,减少设计师75%办公加班时间
  11. Gradle之使用Gradle的命令行
  12. Vue err:This dependency was not found
  13. 【CS229】代价函数与梯度下降
  14. webbrowser在vb中叫
  15. WP中Document的层次设计
  16. 一道简单的但是经典的动态规划题目
  17. linux内核态删除文件函数,初探Linux内核态——通过proc文件系统作快速问题定位...
  18. 【chp2】车万翔-自然语言处理:基于预训练模型的方法
  19. linux --- linux目录结构
  20. STM32H7高性能MCU系列 STM32H7A3NGH6 32-bit RISC内核

热门文章

  1. 【数据结构】——环形队列
  2. MATLAB线形规划函数linprog、intlinprog与二次规划函数quadprog
  3. 三种方法求递归算法的时间复杂度(递推,master定理,递归树)
  4. Android职业规划
  5. 作业5管理用户、组及权限
  6. Win10中使用CMD命令遍历文件夹删除重复文件
  7. Python 爬抖音
  8. linux管道的使用
  9. 浅谈 iframe的优缺点以及使用场景
  10. react强制页面刷新