与 IE9 一起安装的 Chakra Javascript 引擎的 CLSID 是
{16d51579-a30b-4c8b-a276-0ff4dc41e755}
.
InProcServer32 是%windir%\System32\jscript9.dll
.
没有我能找到的 ProgId。这有点奇怪。通常成对的 ProgId 和 CLSID 条目相互引用。对于给定的 COM 对象,注册表中的 ProgId 键有一个名为 CLSID 的子键,而 CLSID 注册表键有一个名为 ProgId 的子键,它们相互引用。但是 IE9 CLSID 的 ProgId 子键是“JScript”,这当然是指 v5.8 Jscript CLSID。不确定这是微软的错误,还是故意混淆,因为他们不希望任何人在 IE9 之外使用 Chakra 引擎。在我看来是有目的的。
我通过在注册表中搜索 jscript9.dll 了解了 CLSID。
如果您有托管脚本引擎的 .NET 代码,则可以直接使用 CLSID 为 IE9 javascript 引擎(“Chakra”)实例化 IActiveScript 对象。代码需要是这样的:
private const string clsIdPattern =
@"^(?<curly>\{)?[a-zA-Z0-9]{8}(?:-[a-zA-Z0-9]{4}){3}-[a-zA-Z0-9]{12}(?(curly)\})$";
public ScriptEngine(string language)
{
if (language == null)
throw new ArgumentNullException("language");
Type engineType = null;
if (Regex.IsMatch(language, clsIdPattern))
{
// it's a CLSID
var guid = new System.Guid(language);
engineType = Type.GetTypeFromCLSID(guid, true);
}
else
{
// assume vanilla progId
engineType = Type.GetTypeFromProgID(language, true);
}
var engine = Activator.CreateInstance(engineType) as IActiveScript;
在上面,clsIdPattern
是一个匹配熟悉的 GUID 格式的正则表达式,可以有或没有环绕的花括号。
鉴于上面的代码,您可以传递“jscript”、“Javascript”或“ECMAScript”并获得 v5.8 JScript 引擎。或者您可以通过“{16d51579-a30b-4c8b-a276-0ff4dc41e755}”并获取 IE9 Javascript 引擎。显然,您需要安装 IE9 才能使其正常工作。
我刚试过这个,它适用于简单的情况。我会再玩一些,真的很快。
如果你想从 WSH 运行 Chakra,比如从 cscript.exe,那么你需要一个 ProgId,我想。
如果我在注册表中创建“Chakra”作为 Progid,引用正确的 CLSID,我可以通过 IE9 的引擎运行 JS 文件,如下所示:
cscript.exe module.js //E:Chakra
例如,插入新的“Chakra”ProgId 后,给定如下脚本:
WScript.Echo( ScriptEngineMajorVersion() + "." +
ScriptEngineMinorVersion() + "." +
ScriptEngineBuildVersion());
...输出是这样的:
C:\dev\js>Version.js
5.8.16982
C:\dev\js>cscript.exe Version.js //E:Chakra
9.0.16434
这是 Javascript 中的 AES 加密测试的结果,将 Chakra 与 JScript 5.8 进行了比较:
C:\dev\js\SlowAES>cscript.exe test.aes.js
AES encryption in Javascript.
password : Albatros1
salt : saltines (73616c74696e6573)
iterations: 1000
key : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66
iv : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248
plaintext : Hello, /r/javascript.
ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182
decrypted : Hello, /r/javascript.
elapsed : 5011ms
C:\dev\js\SlowAES>cscript.exe test.aes.js //E:Chakra
AES encryption in Javascript.
password : Albatros1
salt : saltines (73616c74696e6573)
iterations: 1000
key : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66
iv : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248
plaintext : Hello, /r/javascript.
ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182
decrypted : Hello, /r/javascript.
elapsed : 2593ms
要在我的注册表中设置 ProgId,我使用了这个:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="Chakra"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="Chakra"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra]
@="JScript Language"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\CLSID]
@="{16d51579-a30b-4c8b-a276-0ff4dc41e755}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\OLEScript]
为了暴露 Chakra,或者恢复注册表,我这样做了:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="JScript"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="JScript"
[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra]
此注册表脚本适用于 x64 Windows;如果您没有 x64,则需要删除 WOW6432Node 行。