首页 » 排名链接 » 体积小使用系统自带ES6 组件(组件代码软件调用系统自带)

体积小使用系统自带ES6 组件(组件代码软件调用系统自带)

乖囧猫 2024-10-24 09:37:55 0

扫一扫用手机浏览

文章目录 [+]

上代码,看例子:

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}","SOFTWARE\Classes\Chakra\CLSID");

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

体积小使用系统自带ES6 组件(组件代码软件调用系统自带) 排名链接
(图片来自网络侵删)

但我不想用这个改注册表的方法,自己要怎么玩都可以,尽量别影响别人。
那么我们分析一下,为什么非要在注册表里加这一句呢?很明显,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 中还有不计其数这样的库。

标签:

相关文章