aardio + VBScript 快速开发独立 EXE 桌面程序

aardio 与 VBScript 可以直接混合编程,VBScript 属于 Windows 系统自带组件 —— 可以方便地生成独立 EXE 程序。

快速入门

首先创建 VBScript 解释器,aardio 代码示例:

import web.script;
var vm = web.script("VBScript")

可以将 aardio 对象(表、数组、函数)直接赋值为 vm 解释器的成员,然后就可以在 VBScript 中调用这些 aardio 对象了,aardio 代码示例如下:

//添加一个 aardio 函数到 VBScript
vm.external = {
	add = function(a,b){
		return a + b;
	};
}

用上面的方法模拟 WScript 对象:

vm.WScript = { 
	CreateObject = com.CreateObject;
	GetObject = com.GetObject;
	Echo = function(...){
		console.log(...);
	};
}

import console;

下面指定要执行的 VBScript 代码,也可以用 vm.doScript() 函数运行 VBScript 。

vm.script = /*
Function TestFunction(a,b) 
	Dim shell, ns, item
	
	'创建 COM 对象
	Set shell = CreateObject("Shell.Application") 
	Set ns = shell.NameSpace("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}")
	
	'遍历 COM 对象
	For Each item In ns.Items()
		'注意 VBScript 调用方法且不接收返回值时,不要加括号。
    	 WScript.Echo item.Name,item.Path
	Next
	
   TestFunction = external.add(a(0),b(0))
End Function
*/ 

注意在 aardio 中 /* */ 这样的段注释可以赋值为字符串 。因为 aardio 要求段注释首尾的星号数目一致,所以很适合用于包含其他编程语言的代码。请参考:aardio 编程语言快速入门——语法速览

aardio 可以通过 vm.script.函数名() 直接调用 VBScript 函数,aardio 代码示例:

var ret = vm.script.TestFunction({12,13},{2,3});
console.log( ret );

以上示例的完整源码请参考 aardio 自带范例:

运行 VBScript 并获取表达式的值

aardio 代码示例:

import web.script;
var vm = web.script("VBScript")
 
var version = vm.eval(
`ScriptEngine() & " " & ScriptEngineMajorVersion() &_
"."  & ScriptEngineMinorVersion() & "."  & ScriptEngineBuildVersion()`
);

import console;	
console.log(version);
console.pause();

VBScript 解析 JSON

VBScript 解析 JSON 不是很方便,我们用 aardio 为 VBScript 添加 JSON 解析功能。
aardio 的 JSON 解析器兼容JSON,JSONP,JSON5,部分类 YAML 语法。下面看 aardio 代码示例:

//导入 VBScript + JSON 支持库
import web.script.json;

//创建 VBScript 解析器
var vm = web.script("VBScript");

//添加 VBScript 函数
vm.external = {
	log = function(...){
		console.log(...);
	}; 
}
import console;

//执行 VBScript
vm.script = /*
Function TestFunction() 

	'解析 JSON
	Set jObject = JSON.parse("{name:{a:123:b:456,c:[1,2,3]}}" ) 
	jObject.newKey = "测试"
	
	arr = jObject.name.c
	arr(0) = "测试"
	
	'遍历 JSON 数组
	For Each item In arr
    	 external.log item
	Next
	
 	TestFunction =  arr(0) 
End Function
*/ 

//调用 VBScript 函数。
var ret = vm.script.TestFunction();
console.dump(ret);

console.pause();

编写 VBScript 扩展库

这里说明一下扩展 VBScript 功能的 aardio 扩展库 web.script.json 是如何写出来的。

首先需要了解 web.script 不仅仅是可以用于执行 VBScript ,也可以用于执行 JavaScript ,参考:aardio + JavaScript 快速开发桌面软件,体积小使用系统自带ES6 组件

web.script 在创建脚本解释器时,会检查 web.script.preload 名字空间下的所有扩展对象,先看一下 web.script 的构造函数的相关 aardio 代码:

import com;
namespace web;

class script {
	ctor(language = 'JScript'){{
		this.msc = ..com.CreateObject("ScriptControl");
			
		// …… 其他代码省略

		this.reset = function(){
			this.msc.Reset();
			
			//脚本语言名称转为小写
			var lang = ..string.lower(this.msc.Language);
		
			//遍历 web.script.preload 名字空间
			for(k,v in self.preload){
				
				//如果扩展对象的 language 表指定了对当前语言启用扩展
				if(!v.language || v.language[lang]){
					
					//执行扩展对象的 code 属性指定的脚本代码
					if(v.code)this.msc.AddCode(v.code);
					
					//执行扩展对象的 init 函数
					if(v.init)v.init(this.msc);
				}
			}	
		}
		this.reset();
		
		// …… 其他代码省略
	}}  
}

web.script.preload 名字空间下的扩展对象,可选指定以下三个属性:

1、属性 language 可用表对象指定支持哪些语言。

2、属性 code 可用于指定默认加载的脚本代码。

3、属性 init 可指定初始化执行的函数。

然后我们再看一下 web.script.json 扩展库的 aardio 代码:

import web.json;
import web.script;
namespace web.script.json{};

// JavaScript 扩展
namespace web.script.preload.json3 {
	language = {
		javascript = true;
		jscript = true;
	}
	code =  //省略JSON3 源码
}

// VBScript 扩展
namespace web.script.preload.json3vbs {
	language = {
		vbscript = true;
		vbs = true;
	}
	init = function(msc){
		msc.AddObject("JSON",{ 
			parse = function(...){ 
				return ..web.json.parse(...);
			};
			stringify = function(...){ 
				return  ..web.json.stringify(...)
			}; 	
		})
	}
}
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章