首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IE9Javascript引擎的ProgId或CLSID是什么(代号为"Chakra")

IE9Javascript引擎的ProgId或CLSID是什么(代号为"Chakra")
EN

Stack Overflow用户
提问于 2011-08-24 05:19:18
回答 2查看 7.8K关注 0票数 23

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

用代码实现的方法是这样的:

代码语言:javascript
运行
复制
    Type engine = Type.GetTypeFromProgID(progId, true);
    _engine = Activator.CreateInstance(engine) as IActiveScript;

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

代码语言:javascript
运行
复制
cscript.exe  <file>  //e:JScript

..will通过JScript引擎运行指定的文件,而不考虑其扩展名。

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

有没有可以指定的ProgId或CLSID来运行IE9Javascript引擎,也就是"Chakra"?

IE9的引擎仍然由IActiveScript加载吗?

Microsoft's documentation suggests that it does,但不指定ProgId或CLSID。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-24 07:44:33

与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.8Jscript CLSID。我不确定这是微软的错误,还是故意的混淆,因为他们不希望任何人在IE9之外使用Chakra引擎。在我看来是有目的的。

我是通过在注册表中搜索jscript9.dll了解到CLSID的。

如果您有托管脚本引擎的.NET代码,则可以通过直接使用CLSID来实例化IE9 javascript引擎("Chakra")的IActiveScript对象。代码需要如下所示:

代码语言:javascript
运行
复制
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运行查克拉,比如从cscript.exe运行查克拉,我想你需要一个ProgId。

如果我在注册表中创建"Chakra“作为Progid,引用正确的CLSID,我可以通过IE9的引擎运行JS文件,如下所示:

代码语言:javascript
运行
复制
cscript.exe  module.js  //E:Chakra 

例如,在插入新的"Chakra“ProgId之后,给出如下脚本:

代码语言:javascript
运行
复制
WScript.Echo( ScriptEngineMajorVersion() + "." +
              ScriptEngineMinorVersion() + "." +
              ScriptEngineBuildVersion());

...the输出如下所示:

代码语言:javascript
运行
复制
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进行了比较:

代码语言:javascript
运行
复制
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,我使用以下命令:

代码语言:javascript
运行
复制
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,或者恢复注册表,我这样做了:

代码语言:javascript
运行
复制
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窗口;如果您没有x64,则需要删除WOW6432Node行。

票数 33
EN

Stack Overflow用户

发布于 2014-01-17 00:25:24

现在,您可以通过发布的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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7167690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档