【问题标题】:What is the ProgId or CLSID for IE9's Javascript engine (code-named "Chakra")IE9 的 Javascript 引擎的 ProgId 或 CLSID 是什么(代号为“Chakra”)
【发布时间】:2011-11-02 07:40:27
【问题描述】:

使用 .NET,我可以编写一个应用程序,该应用程序托管一个符合 Microsoft 的 IActiveScript 约定的脚本引擎。这包括来自 Microsoft 的 JScript 和 VBScript,以及 PerlScript、RubyScript 和 I don't know what else from third-parties

在代码中实现的方法是这样的:

    Type engine = Type.GetTypeFromProgID(progId, true);
    _engine = Activator.CreateInstance(engine) as IActiveScript;

progId 可以取值 Javascript、JScript、ECMAScript、VBScript 等。您可以在运行 cscript.exe 时执行类似的操作,在命令行中使用 //E 选项指定 progId。例如,这个命令:

cscript.exe  <file>  //e:JScript

..将通过 JScript 引擎运行指定的文件,无论其扩展名如何。

在我的机器上,如果我查看 HKLM\SW\Classes\ ,三个 progId {Javascript, JScript, ECMAScript} 都指向同一个 CLSID,我猜是 JScript 5.8 脚本引擎:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

我可以指定一个 ProgId 或 CLSID 来运行 IE9 的 Javascript 引擎,也就是“Chakra”吗?

IE9 的引擎是否仍由 IActiveScript 加载?
Microsoft's documentation suggests that it does,但未指定 ProgId 或 CLSID。

【问题讨论】:

  • 我没有真正的答案,但试试这个:启动 IE9,使用 JavaScript 转到页面并检查 IE 进程中加载​​了哪些 DLL 等...缩小相应的 DLL -然后找出哪个已注册......从那里应该可以查明CLSID
  • 我认为这个问题现在已经过时了。我认为微软已经正式将 Chakra 公开为脚本引擎,所以你不需要做任何这些废话。但我不知道细节。只是谣言。

标签: javascript .net wsh chakra iactivescript


【解决方案1】:

您现在可以通过已发布的 API 直接调用 Chakra 运行时,而不必再使用 IActiveScript

这是 MSDN 上的一篇文章,展示了如何在 C++ 或 C# 中托管 Chakra 运行时:

https://web.archive.org/web/20151103122111/https://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

(注意:截至2019年,代码示例在github.com/microsoft/Chakra-Samples)

【讨论】:

  • 太棒了!谢谢,贾斯汀。
【解决方案2】:

可能有点晚了,但是:

您也可以通过 //E 参数简单地指定要使用的引擎的 CLSID:

cscript.exe  //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755}

编辑: 根据 Cheeso 的回答,我发现只需添加以下注册表项即可在不指定 CLSID 的情况下使用 jscript9。我在这里使用键名 JScript9,如果你愿意,可以用 Chakra 替换它。键名是您在 //E: then: 之后指定的内容:

Windows 注册表编辑器版本 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9] @="JScript9 语言" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\CLSID] @="{16d51579-a30b-4c8b-a276-0ff4dc41e755}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\OLEScript]

然后:

cscript.exe  //E:JScript9

【讨论】:

    【解决方案3】:

    使用 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 行。

    【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多