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

aardio + VBScript 混合开发的更多相关文章

  1. aardio + AutoHotkey 混合编程

    本文主要介绍 aardio + AutoHotkey 混合编程. 在 aardio 中可以调用很多编程语言,例如 C语言.C++.C#.Java.Python.R.Javascript.Node.Js ...

  2. egret3D与2D混合开发,画布尺寸不一致的问题

    egret3d的GUI目前还没有,在做3d游戏的时候没有UI可用,只能使用egret2d的EUI组件库,egret3d与egret2d混合开发,canvas3d的大小与位置与canvas2d并没有重合 ...

  3. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  4. 基于ionic+angulajs的混合开发实现地铁APP

    基于ionic+angulajs的混合开发实现地铁APP 注:本博文为博主原创,转载时请注明出处. 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一. ...

  5. IOS-Hybrid(混合开发)

    http://www.cnblogs.com/oc-bowen/p/5423902.html 1.1.     APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等 ...

  6. Hybrid APP混合开发的一些经验和总结

    http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...

  7. 移动开发发展方向-----Hybird混合开发3大方案

    移动开发发展方向-----Hybird混合开发3大方案

  8. android混合开发,webview的java与js互操作

    android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用web ...

  9. (读书笔记)Asp.net Mvc 与WebForm 混合开发

    根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ...

随机推荐

  1. Tampermonkey究竟有什么用?

    以具体应用实例加以说明. 目标:在youtube页面上观看视频,发现喜欢的视频,单击按钮就可以下载视频. 但是,youtube页面并未提供这样的按钮及其功能. 实现思路:在浏览器下载youtube页面 ...

  2. SpringBoot整合RabbitMQ实现六种工作模式

    RabbitMQ主要有六种种工作模式,本文整合SpringBoot分别介绍工作模式的实现. 前提概念 生产者 消息生产者或者发送者,使用P表示: 队列 消息从生产端发送到消费端,一定要通过队列转发,使 ...

  3. HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态

    HMS Core 在AI领域最新的技术能力有哪些?本期Discovery直播以<与虎墩一起,玩转AI新"声"态>为主题,邀请了HMS Core 机器学习服务产品经理.机 ...

  4. 人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_186 "从来如此,便对么?",鲁迅先生在<狂人日记>中借狂人之口在月光下发出的质疑与呐喊,是的,从 ...

  5. 深入Synchronized各种使用方法

    深入学习Synchronized各种使用方法 在Java当中synchronized通常是用来标记一个方法或者代码块.在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个 ...

  6. goalng-sync/atomic原子操作

    目录 1.go已经提供了锁,为什么还需要atomic原子操作? 2.atomic原子操作为什么比mutex快? 3.CAS 4.互斥锁与原子操作区别 5.原子操作方法 5.1 atomic.AddIn ...

  7. Linux下一键安装Python3&更改镜像源&虚拟环境管理技巧

    前言 之前分享过一篇<Linux系统自带Python2&yum的卸载及重装>,介绍了如何卸载及重装Linux(CentOS)自带的的Python2.7.今天主要介绍如何在Linux ...

  8. 五,手写SpringMVC框架,过滤器的使用

    8. 过滤器 8.1 编写字符过滤器 CharacterEncodingFilter 复制项目mymvc4,新建项目mymvc5 package com.hy.filter; import java. ...

  9. 使用Fiddler劫持网络资源为前端开发助力(示例:Dynamic CRM 表单开发 也能热更新? )

    背景: 使用过vue开发的童鞋应该都知道,在开发vue项目的过程中,有个叫"热更新"的功能特别爽,在传统html开发到初次接触vue时,才发现原来前端开发可以这么香.热更新的表现形 ...

  10. Github文件在线加速下载

    众所周知,GitHub是一个巨大的开源宝库,以及程序员和编程爱好者的聚集地,诸多优秀的开源项目全部都是位于GitHub上.但是每当我们看到优秀的开源项目,准备去下(bai)载(piao)时,会发现速度 ...