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 自带范例:
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 支持库 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();
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(); // …… 其他代码省略 }} }
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(...) }; }) } }