小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

一句代碼嵌入系統(tǒng)自帶 ES6/ES2015 組件,不增加軟件體積,直接調(diào)用 JavaScript 對(duì)象與函數(shù)。

 _src_ 2023-03-06 發(fā)布于四川

很多人可能不知道,Win10/Win11 自帶一個(gè)強(qiáng)大的 ES6 組件 Chakra.dll (至于過(guò)氣的 Win7 已經(jīng)很難找到幾個(gè)用戶了,這里先忽略 )。Chakra.dll 已經(jīng)導(dǎo)出了非常方便的動(dòng)態(tài)接口,用起來(lái)簡(jiǎn)潔、省事、方便,不需要帶上 DLL 組件,不會(huì)增加軟件體積。

有趣的是,這個(gè)接口知道的人極少,中文網(wǎng)頁(yè)上沒(méi)有任何討論。aardio 最新版的標(biāo)準(zhǔn)庫(kù) web.script 已經(jīng)支持 Chakra。只要簡(jiǎn)單的指定腳本語(yǔ)言為 "ES6" 就可以調(diào)用 Chakra 了,其他的什么也不用做,然后就可以享用 Chakra 的強(qiáng)悍性能,舒服的 ES6、箭頭函數(shù)、let、const 、類 …… JavaScript 直接調(diào)用 aardio ,aardio 直接調(diào)用 JavaScript,簡(jiǎn)單粗暴不麻煩。


上代碼,看例子:





























import web.script;var chakra = web.script("ES6"); 
//導(dǎo)出 aardio 函數(shù)到 JavaScriptchakra.external = { log = function(...){ } } chakra.script = /**
external.log("JavaScript 調(diào)用 aardio 函數(shù)");
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;}**/
//調(diào)用 JavaScript 函數(shù)var ret = chakra.script.test(1000) ;

web.script 基于 COM 對(duì)象 ScriptControl 創(chuàng)建腳本解釋器,ScriptControl 默認(rèn)其實(shí)并不支持 "ES6" 這個(gè)語(yǔ)言名稱,這是我自己隨手編的一個(gè)名字,那么為什么可以調(diào)用 Chakra 呢?下面講原理。

要想 ScriptControl  支持一個(gè)新語(yǔ)言,那么注冊(cè)表里必須有這個(gè)新的 ProgID。但是 Chakra 這個(gè) ProgID 并不存在,一個(gè)方法是改注冊(cè)表,
aardio 代碼如下:


sys.reg.setValue(,"{1b7cd997-e5ff-4932-a7a6-2a9e636da385}","SOFTWARE\Classes\Chakra\CLSID");

sys.reg.setValue 默認(rèn)寫的是 HKCU ,所以這句代碼不需要請(qǐng)求管理權(quán)限,可以靜默注冊(cè)。

但我不想用這個(gè)改注冊(cè)表的方法,自己要怎么玩都可以,盡量別影響別人。那么我們分析一下,為什么非要在注冊(cè)表里加這一句呢?很明顯,ScriptControl  需要在注冊(cè)表里使用這個(gè) ProgId 查詢 CLSID,而干這事需要 調(diào)用 WinAPI 函數(shù) CLSIDFromProgID。所以我們只要簡(jiǎn)單地?cái)r截這個(gè) API 調(diào)用 —— 并直接返回 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();
//指定腳本語(yǔ)言為 "ES6"this.msc.Language = language;
//卸載 API 鉤子 apiHook.unInstall();

關(guān)鍵代碼就這幾句,干凈綠色無(wú)污染。更多細(xì)節(jié)可查看 web.script  源代碼。

web.script("ES6") 在 Win7, WinXP 上會(huì)自動(dòng)退化為 web.script("JScript")。所以我們可以做一些有趣的事了,例如我基于這個(gè)實(shí)現(xiàn)了擴(kuò)展庫(kù) web.script.yaml (基于 js-yaml ),不但全兼容 XP,Win7,Win8,Win10,Win11 ……,而且在 Win10 / Win11 上可以自動(dòng)切換為使用更快更好的 Chakra。 

這個(gè) web.script.yaml 的體積也非常小,只有幾十 KB。我們沒(méi)必要為了解析個(gè) YAML 就帶上十幾 MB 的組件,如果這樣玩下去,一個(gè)小軟件很快就會(huì)變成幾百 MB。
反之,如果我們總是優(yōu)先使用系統(tǒng)自帶組件,這里省個(gè) 10 MB,那里省個(gè) 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();

如果只能在 WinXP,Win7 上玩耍,我給大家寫了一個(gè)庫(kù) web.script.es5,導(dǎo)入這個(gè)庫(kù)以后,即使在 WinXP,Win7 上至少也可以支持 ES5。來(lái)個(gè)例子:




















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 中一個(gè)小小的 web.script 可以玩出這么多花樣。aardio 中還有不計(jì)其數(shù)這樣的庫(kù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多