1

Тема: COM-объект, умеющий исполнять JScript.

Доброго времени суток! Вопрос у меня следующий. Есть ли в Windows такой ActiveX объект, который умеет "заглатывать" JScript? "htmlfile" не подходит, поскольку, скажем, если скормить ему вот это:

var WSO = new ActiveXObject('Scripting.WindowSystemObject');

Он скажет, что ему не удалось завершить действие. Также нет доступа к WScript, файловой системе и многому другому.

2

Re: COM-объект, умеющий исполнять JScript.

Есть Microsoft Script Control. Правда, WScript в нём тоже нет, т.к. это объект Windows Script Host (wscript.exe/cscript.exe).

3 (изменено: vo1ty, 2012-12-11 23:54:36)

Re: COM-объект, умеющий исполнять JScript.

Спасибо, думаю, это подойдёт. Без WScript постараюсь обойтись

4 (изменено: wisgest, 2014-01-02 04:45:19)

Re: COM-объект, умеющий исполнять JScript.

COM-объект, умеющий исполнять JScript:

<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>

— сохранить в файл с расширением «wsc».
Так как я не знаю, где его нужно использовать, то приведу пример вызова из VBSript:

Set JS = GetObject("script:" & WScript.ScriptFullName & "\..\JS.wsc")
MsgBox JS.eval("2*2")

Set JsGlobal = JS.eval("this")
MsgBox JsGlobal.Math.PI

То же на AutoHotkey (добавлено 30.12.2013):

JS := ComObjGet("script:" . A_ScriptDir . "\JS.wsc")
MsgBox % JS.eval("2*2")

JsGlobal := JS.eval("this")
MsgBox % JsGlobal.Math.PI

Вместо трансляции функции eval() можно сразу передавать глобальный объект JScript (хотя код wsc в этом случае будет чуть менее минималистичным) или и то и другое сразу, хотя достаточно чего-либо одного — второе можно будет получить через него. (Хотя, к слову, из htmlfile передать глобальный объект JScript в VBScript  мне не удалось.)

--------------------
02.01.2014: Добавил решение в коллекцию: AHK: Выполненние JScript-кода с помощью WSC.

5

Re: COM-объект, умеющий исполнять JScript.

wisgest пишет:

Хотя, к слову, из htmlfile передать глобальный объект JScript в VBScript  мне не удалось.

Вот в этом посте http://forum.script-coding.com/viewtopi … 067#p33067 приведен скрипт от JSman, получающий глобальный объект JScript из htmlfile. Ниже привожу скрипт, использующий данную технику, в комментариях я указал вывод msgbox:

' получение jsglobal
set htmlfile = createobject("htmlfile")
set jsglobal = htmlfile.parentwindow
jsglobal.execscript ";", "jscript"
' тестирование
msgbox jsglobal.math.pi ' отображает 3,14159265358979
jsglobal.eval("var dict = new ActiveXObject('Scripting.Dictionary'); dict('mykey') = 'myvalue'; alert('test');")
msgbox jsglobal.dict.item("mykey") ' отображает myvalue
msgbox typename(jsglobal.eval("window")) ' отображает Empty
msgbox typename(jsglobal.eval("this")) ' отображает Empty
msgbox typename(jsglobal.eval("(function a(){return window})()")) ' отображает Empty
msgbox typename(jsglobal.eval("(function b(){return this})()")) ' отображает Empty
msgbox jsglobal.eval("({transfer:window})").transfer is jsglobal ' отображает Истина
msgbox jsglobal.eval("({transfer:this})").transfer is jsglobal ' отображает Истина
set htmlfile = nothing

jsglobal.eval() возвращает Empty вместо объектов, но если создать объект со свойством transfer, то через это свойство объекты передаются как и ожидалось. Я не особо силен в JScript и ответ может быть очевиден, но все же - от чего так происходит?

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

6 (изменено: wisgest, 2013-09-16 00:08:52)

Re: COM-объект, умеющий исполнять JScript.

omegastripes, большое спасибо за содержательное замечание!! Особенно интересно

msgbox jsglobal.eval("({transfer:window})").transfer is jsglobal ' отображает Истина
msgbox jsglobal.eval("({transfer:this})").transfer is jsglobal ' отображает Истина

и

jsglobal.execscript ";", "jscript"
omegastripes пишет:

Вот в этом посте http://forum.script-coding.com/viewtopi … 067#p33067 приведен скрипт от JSman, получающий глобальный объект JScript из htmlfile.

Ну да, подобное мне известно. Скорее всего, я имел ввиду, что не работает

Set htmldoc = CreateObject("htmlfile")
Set Script = htmldoc.Script ' то же, что htmldoc.parentWindow
Script.execScript "var eval = eval;", "JScript"

Set JsGlobal = Script.eval("this")

Почему не захотел использовать уже полученный объект Script, сейчас сказать не могу.

omegastripes пишет:

но все же - от чего так происходит?

Для меня это загадка природы.

7

Re: COM-объект, умеющий исполнять JScript.

function [СоздатьОбъект]([Строка])
    set [СоздатьОбъект]=CreateObject([Строка])
end function

set [ХТМЛ] = [СоздатьОбъект]("htmlfile")
[ХТМЛ].Open("text/html")
'<-- Подготовим нужные методы
[ХТМЛ].Write("<script language='JScript'>var ХТМЛ;Новый=function(x,y){return new x(y)}</script>")
set [Док]=[ХТМЛ].documentElement.document
' Внедрение объекта Скрипта в самого себя, для сохранности контекста
[Док].Script.[ХТМЛ]=[ХТМЛ]
set [Это]=[Док].Script
set [Математика]=[Это].Math
msgbox [Математика].pow(2,8)
set [Дата]=[Это].[Новый]([Это].Date,Now)
msgbox [Дата].toString(0)
msgbox [Дата].getTime(0)
Я конечно далек от мысли... (с)