7

aardio + VBScript 混合开发 - aardio

 1 year ago
source link: https://www.cnblogs.com/aardio/p/16734184.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 自带范例:

59ec72152ecf4e6ebe451eca31a6e7d0~noop.image?_iz=58558&from=article.pc_detail&x-expires=1664857660&x-signature=9U47bp1DHBZI%2FaeXjmeWMgetmeA%3D

▶ 运行 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(...)
            };     
        })
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK