¿Cuál es el ProgId o CLSID para el motor de Javascript de IE9(cuyo nombre en código es "Chakra")?
.net wsh (3)
Utilizando .NET, puedo escribir una aplicación que aloja un motor de scripts que cumple con las convenciones de IActiveScript de Microsoft. Esto incluye JScript y VBScript de Microsoft, y también PerlScript, RubyScript y no sé qué más de terceros .
La forma de hacerlo en código es algo como esto:
Type engine = Type.GetTypeFromProgID(progId, true);
_engine = Activator.CreateInstance(engine) as IActiveScript;
donde el progId
puede tomar el valor Javascript, JScript, ECMAScript, VBScript y otros. Puede hacer algo similar cuando ejecuta cscript.exe, especificando el programa en la línea de comando con la opción //E
Por ejemplo, este comando:
cscript.exe <file> //e:JScript
.. ejecutará el archivo especificado, independientemente de su extensión, a través del motor JScript.
En mi máquina, si busco en HKLM/SW/Classes/
, los tres programas {Javascript, JScript, ECMAScript} apuntan al mismo CLSID, que creo que es el motor de scripts de JScript 5.8: {f414c260-6ac0-11cf-b6d1-00aa00bbbb58}
¿Existe un ProgId o CLSID que pueda especificar para ejecutar el motor de Javascript de IE9, también conocido como "Chakra"?
¿El motor de IE9 aún se carga con IActiveScript?
La documentación de Microsoft sugiere que lo hace , pero no especifica un ProgId o un CLSID.
Ahora puede llamar al tiempo de ejecución de Chakra directamente a través de las API publicadas y ya no tiene que usar IActiveScript.
Aquí hay un artículo en MSDN que muestra cómo alojar el tiempo de ejecución de Chakra en C ++ o C #:
http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880
El CLSID para el motor Javascript de Chakra instalado con IE9 es
{16d51579-a30b-4c8b-a276-0ff4dc41e755}
.
InProcServer32 es %windir%/System32/jscript9.dll
.
No hay un programa que pueda encontrar. Eso es un poco extraño; las entradas normalmente emparejadas de ProgId y CLSID se refieren entre sí. Para un objeto COM dado, la clave ProgId en el registro tiene una subclave llamada CLSID, y la clave de registro CLSID tiene una subclave llamada ProgId, y se refieren entre sí. Pero la subclave ProgId para IE9 CLSID es "JScript", que por supuesto se refiere al v5.8 Jscript CLSID. No estoy seguro de si esto fue un error de Microsoft, o una ofuscación intencionada, porque no quieren que nadie use el motor de Chakra fuera de IE9. Se ve útil para mí.
Me enteré del CLSID simplemente buscando en el registro jscript9.dll.
Si tiene un código .NET que aloja motores de scripting, puede crear una instancia del objeto IActiveScript para el motor de JavaScript IE9 ("Chakra") utilizando directamente el CLSID. El código debe ser algo como esto:
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;
En lo anterior, clsIdPattern
es una expresión regular que coincide con el formato GUID familiar, con o sin curlies circundantes.
Dado el código anterior, puede pasar "jscript", "Javascript" o "ECMAScript" y obtener el motor v5.8 JScript. O podría pasar "{16d51579-a30b-4c8b-a276-0ff4dc41e755}" y obtener el motor de Javascript IE9. Obviamente necesitas tener IE9 instalado para que esto funcione.
Acabo de probar esto y funciona para casos simples. Voy a jugar con eso un poco más, muy pronto.
Si desea ejecutar Chakra desde WSH, como desde cscript.exe, entonces necesitará un ProgId, creo.
Si creo "Chakra" como un Progid en el registro, refiriéndome al CLSID correcto, puedo ejecutar archivos JS a través del motor de IE9 de esta manera:
cscript.exe module.js //E:Chakra
Por ejemplo, después de insertar el nuevo ProgId "Chakra", se le da un script como este:
WScript.Echo( ScriptEngineMajorVersion() + "." +
ScriptEngineMinorVersion() + "." +
ScriptEngineBuildVersion());
... la salida es así:
C:/dev/js>Version.js
5.8.16982
C:/dev/js>cscript.exe Version.js //E:Chakra
9.0.16434
Y aquí está el resultado de una prueba de cifrado AES en Javascript, que compara Chakra con 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
Para configurar ProgId en mi registro, utilicé esto:
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]
y para exponer Chakra, o revertir el registro, hice esto:
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]
Este script de registro funcionó con x64 Windows; si no tiene x64, deberá eliminar las líneas WOW6432Node.
Podría ser un poco tarde, pero:
También puede simplemente especificar el CLSID del motor que desea usar a través del argumento // E:
cscript.exe <file> //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755}
Editar: Según la respuesta de Cheeso, encontré que es suficiente agregar las siguientes entradas de registro para poder usar jscript9 sin especificar el CLSID. Utilizo aquí el nombre clave JScript9 , puede reemplazarlo por Chakra si lo desea. El nombre de la clave es lo que especifica después de // E: entonces:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE/SOFTWARE/Classes/JScript9] @="JScript9 Language" [HKEY_LOCAL_MACHINE/SOFTWARE/Classes/JScript9/CLSID] @="{16d51579-a30b-4c8b-a276-0ff4dc41e755}" [HKEY_LOCAL_MACHINE/SOFTWARE/Classes/JScript9/OLEScript]
Y entonces:
cscript.exe <file> //E:JScript9