aardio + JavaScript 快速开发桌面软件,体积小使用系统自带ES6 组件

上代码,看例子:

import web.script;var chakra = web.script("ES6"); //导出 aardio 函数到 JavaScriptchakra.external = {  log = function(...){ } } chakra.script = /**external.log("JavaScript 调用 aardio 函数");var test = function(arg){   let result = 0;  let numbers = [1,2,3];    if(Array.isArray(numbers)){    numbers.forEach( (value) =>{      result = result + value;     });    }      return arg + result;}**///调用 JavaScript 函数var ret = chakra.script.test(1000) ;

web.script 基于 COM 对象 ScriptControl 创建脚本解释器,ScriptControl 默认其实并不支持 “ES6” 这个语言名称,这是我自己随手编的一个名字,那么为什么可以调用 Chakra 呢?下面讲原理。

要想 ScriptControl 支持一个新语言,那么注册表里必须有这个新的 ProgID。但是 Chakra 这个 ProgID 并不存在,一个方法是改注册表,
aardio 代码如下:

sys.reg.setValue(,"{1b7cd997-e5ff-4932-a7a6-2a9e636da385}","SOFTWAREClassesChakraCLSID");

sys.reg.setValue 默认写的是 HKCU ,所以这句代码不需要请求管理权限,可以静默注册。

但我不想用这个改注册表的方法,自己要怎么玩都可以,尽量别影响别人。那么我们分析一下,为什么非要在注册表里加这一句呢?很明显,ScriptControl 需要在注册表里使用这个 ProgId 查询 CLSID,而干这事需要 调用 WinAPI 函数 CLSIDFromProgID。所以我们只要简单地拦截这个 API 调用 —— 并直接返回 Chakra 的 CLSID 就可以了,主要代码如下:

var apiHook = raw.apiHook(  "Ole32.dll", "CLSIDFromProgID", "int(ustring progId,ptr pClsId)",   function( progId,pClsId ){     if(progId == language ) {       raw.copy(pClsId,langClsId,#langClsId);      return 0 ;    }    return owner.callApi(progid,lpclsid); ;  });//安装 API 钩子apiHook.install();//指定脚本语言为 "ES6"this.msc.Language = language;//卸载 API 钩子 apiHook.unInstall();

关键代码就这几句,干净绿色无污染。更多细节可查看 web.script 源代码。

web.script(“ES6”) 在 Win7, WinXP 上会自动退化为 web.script(“JScript”)。所以我们可以做一些有趣的事了,例如我基于这个实现了扩展库 web.script.yaml (基于 js-yaml ),不但全兼容 XP,Win7,Win8,Win10,Win11 ……,而且在 Win10 / Win11 上可以自动切换为使用更快更好的 Chakra。

这个 web.script.yaml 的体积也非常小,只有几十 KB。我们没必要为了解析个 YAML 就带上十几 MB 的组件,如果这样玩下去,一个小软件很快就会变成几百 MB。
反之,如果我们总是优先使用系统自带组件,这里省个 10 MB,那里省个 10 MB,我们就可以用几百 KB 做别人几百 MB 才能做的事。

下面演示一下 web.script.yaml 的用法:

import console;import web.script.yaml;var yaml = web.script.yaml;var yamlText = /*YAML: YAML Ain't Markup Language?What It Is:  YAML is a human-friendly data serialization language.*/var object = yaml.loadAll(yamlText)console.dumpJson(object);var text = yaml.dump(object);console.dump(text);console.pause();

下面我们用前面介绍的技术写一个 YAML/JSON 互转的小软件,先看运行效果:

上面的动画也是用 aardio 写的开源软件 Gif123 ( 仅 755 KB ) 录制的。

下面讲解开发上面这个小软件的步骤与代码,首先下载并打开 aardio ( 永久免费、已活跃更新 17 年 ),aardio 体积极小只有几MB,打开就可以使用 —— 不需要任何复杂的配置。

一、创建工程

主菜单点击「新建工程」:

设置工程名称,然后点「新建工程」:

二、双击 main.aardio 打开主窗口

在主窗口上拖放所需的文本框( richedit )、按钮( button )控件。

点选 richedit 或 button 控件,在右侧属性框设置需要的属性。例如指定按钮的附注:

三、编写代码

双击按钮,自动跳转到代码视图 -> 按钮 oncommand 事件,修改代码如下:

import win.ui;/*DSG{{*/mainForm = win.form(text="yaml2json";right=527;bottom=413)mainForm.add(button={cls="button";text="YAML / JSON 互转";left=207;top=337;right=500;bottom=392;color=14120960;db=1;dl=1;dr=1;font=LOGFONT(h=-14);note="可自动识别源格式";z=1};edit={cls="richedit";left=10;top=10;right=516;bottom=297;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=2})/*}}*/import web.json;import web.script.yaml;var yaml = web.script.yaml;mainForm.button.oncommand = function(id,event){	var str  = string.trim(mainForm.edit.text); 	if(str[1]='{'#){		jObject = web.json.tryParse(str); 		mainForm.edit.text = yaml.dump(jObject);	}	else {		var yObject = yaml.load(mainForm.edit.text);		mainForm.edit.text = web.json.stringify(yObject,true);	}}mainForm.show();win.loopMessage();

对,以上的代码就是这个软件的全部源代码了,aardio 写一个软件就这么简单。

如果只能在 WinXP,Win7 上玩耍,我给大家写了一个库 web.script.es5,导入这个库以后,即使在 WinXP,Win7 上至少也可以支持 ES5。来个例子:

import console;import web.script.es5;var js = web.script(); js.script = /*****var result = 0;var numbers = [1,2,3];if(Array.isArray(numbers)){  numbers.forEach(function(value) {    result = result + value;   });  }*****/console.dump( js.script.result );console.pause();

看,aardio 中一个小小的 web.script 可以玩出这么多花样。aardio 中还有不计其数这样的库。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月27日
下一篇 2022年5月27日

相关推荐