<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH: трансляция объекта WScript]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=1187</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=1187&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH: трансляция объекта WScript».]]></description>
		<lastBuildDate>Thu, 04 Feb 2010 21:28:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: WSH: трансляция объекта WScript]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=32854#p32854</link>
			<description><![CDATA[<p>Совершенно аналогичное решение для языка LangMF. На этот раз объект WScript транслируется в область LangMF через объект многопотоковых скриптов &#039;Atomix.NewLangMF&#039;.</p><p>Потребуется установленный <a href="http://www.script-coding.com/LangMF.html">LangMF 9</a><br />ОС WinXP/7</p>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Thu, 04 Feb 2010 21:28:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=32854#p32854</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: трансляция объекта WScript]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=31007#p31007</link>
			<description><![CDATA[<p><em>Без гарантий, используете на свой страх и риск.</em></p><p>Пример трансляции объекта WScript в область Internet Explorer, через передачу значения заданного произвольного свойства объекта Document, создаваемого скриптом-сервером.</p><p>Предназначен для отслеживания события WMI (запуск процесса) в области Internet Explorer с применением возможностей транслированного объекта WScript.</p><p>Скрипт состоит из двух частей:</p><p>1] Сервер WSH [trns_vbs.js], который создает объект Internet Explorer, выполняет навигацию на документ-клиент и передает ему свою общую область(this) путем присвоения значения заданному произвольному свойству документа. Скрипт-сервер удерживается циклом, что позволяет в любой момент обратится к его объектам.</p><p>2] Документ-клиент [trns_vbs.htm], инициируемый скриптом-сервером, получает общую область скрипта-сервера из значения своего произвольного свойства изначально заданного сервером. Затем из полученной области &quot;вынимается&quot; объект WScript. Таким образом происходит трансляция.</p><p>При использовании транслированного метода WScript.CreateObject в пространстве Internet Explorer, предусматривающего обработку событий, обработка событий однако сохраняется в области скрипта-сервера, что требует дополнительной связки обработчиков событий из области Internet Explorer с областью скрипта-сервера. Для этого из области Internet Explorer вызывается специальная функция области скрипта-сервера, в которую передаются имя события и указатель на обработчик. </p><p>Для начала работы запустите сервер [trns_vbs.js]. После закрытия окна Internet Explorer работа сервера автоматически завершается.</p><p>Платформа: Internet Explorer<br />OC WinME/XP</p>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Wed, 25 Nov 2009 10:58:47 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=31007#p31007</guid>
		</item>
		<item>
			<title><![CDATA[WSH: трансляция объекта WScript]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=9163#p9163</link>
			<description><![CDATA[<p>COM-сервер WshScript.wsc предоставляет возможность использования стандартного объекта WScript там, где он недоступен непосредственно (например, в HTA).</p><p><strong>WshScript.wsc</strong><br /></p><div class="codebox"><pre><code>&lt;?xml version=&#039;1.0&#039; encoding=&#039;windows-1251&#039; standalone=&#039;yes&#039;?&gt;
&lt;component id=&#039;WshScript&#039;&gt;
&lt;registration progid=&#039;WshScript&#039;/&gt;
&lt;public&gt;
  &lt;property name=&#039;Name&#039; dispid=&#039;0&#039;&gt;&lt;get /&gt;&lt;/property&gt;
  &lt;property name=&#039;WScript&#039;&gt;&lt;get /&gt;&lt;/property&gt;
  &lt;method name=&#039;Add&#039;/&gt;
  &lt;method name=&#039;Remove&#039;/&gt;
&lt;/public&gt;

&lt;resource id=&#039;LocalizedName&#039;&gt;Сценарий сервера сценариев Windows&lt;/resource&gt;

&lt;script language=&#039;JScript&#039;&gt;&lt;![CDATA[
var WshGlobal;
(function () {
  var
    WshShell=new ActiveXObject(&quot;WScript.Shell&quot;),
    WshEnvironment=WshShell.Environment(&quot;Process&quot;);
  var
    window_name=String(Math.random());
    SavedEnvString=WshEnvironment(&quot;WshScript_window_name&quot;);
  WshEnvironment(&quot;WshScript_window_name&quot;)=window_name;
  WshShell.Run(&quot;WScript.exe \&quot;%windir%\\System32\\WshScript1.js\&quot;&quot;, 0, true);

  var ShellWindows=(new ActiveXObject(&quot;Shell.Application&quot;)).Windows();
  for (var i=ShellWindows.Count; --i&gt;=0;) {
    var IE=ShellWindows.Item(i);
    try {
      var Script=IE.Document.Script;
      if (Script.name==window_name) {
        WshGlobal=Script.WshGlobal; IE.Quit();
        if (SavedEnvString)
          WshEnvironment(&quot;WshScript_window_name&quot;)=SavedEnvString;
        else
          WshEnvironment.Remove(&quot;WshScript_window_name&quot;);
        return;
      }
    } catch (Err) {}
  }
})();
/************************************/
function get_Name() {return getResource(&quot;LocalizedName&quot;);}
function get_WScript() {return WshGlobal.WScript;}
function Add(EventName, EventHandler) {WshGlobal[EventName]=EventHandler;}
function Remove(EventName) {delete WshGlobal[EventName];}
]]&gt;&lt;/script&gt;
&lt;/component&gt;</code></pre></div><p><strong>WshScript.js</strong><br /></p><div class="codebox"><pre><code>// %windir%\System32\WshScript.js
// Испольуется WshScript.wsc для получения объекта WScript

(function () {
  var IE=new ActiveXObject(&quot;InternetExplorer.Application&quot;);
  IE.Navigate(&quot;about:blank&quot;); while (IE.Busy) WScript.Sleep(50);
  var Script=IE.Document.Script;
  Script.WshGlobal=this;
  Script.name=
    (new ActiveXObject(&quot;WScript.Shell&quot;)).
      ExpandEnvironmentStrings(&quot;%WshScript_window_name%&quot;);
})();

for (;;) WScript.Sleep(0x7fffffff);</code></pre></div><p><strong>WshScript1.js</strong><br /></p><div class="codebox"><pre><code>// %windir%\System32\WshScript1.js
// Испольуется WshScript.wsc для синхронизации с WshScript.js

var WshShell=new ActiveXObject(&quot;WScript.Shell&quot;);
WshShell.Run(&quot;CScript.exe \&quot;%windir%\\System32\\WshScript.js\&quot;&quot;, 0, false);
var window_name=WshShell.ExpandEnvironmentStrings(&quot;%WshScript_window_name%&quot;);

var ShellWindows=(new ActiveXObject(&quot;Shell.Application&quot;)).Windows();
for (;;) {
  for (var i=ShellWindows.Count; --i&gt;=0;)
    try {
      if (ShellWindows.Item(i).Document.Script.name==window_name)
        WScript.Quit();
    } catch (Err) {}
  WScript.Sleep(50);
}</code></pre></div><p>Файлы <strong>WshScript.wsc</strong>, <strong>WshScript.js</strong> и <strong>WshScript1.js</strong> размещаются в каталоге %windir%\System32\, при этом WshScript.wsc необходимо зарегистрировать в системе как COM-сервер.</p><p>COM-сервер WshScript.wsc предоставляет ряд свойств и методов:</p><p>- свойство WScript (только чтение) возвращает стандартный объект WScript;<br />- метод Add(EventName, EventHandler) добавляет обработчик события для объекта, созданного с помощью WScript.CreateObject();<br />- метод Remove(EventName) удаляет созданный ранее обработчик события.</p><p>Файл <strong>test.hta</strong> демонстрирует использование COM-сервера WshScript.wsc и транслируемого объекта WScript.</p><p><strong>test.hta</strong><br /></p><div class="codebox"><pre><code>&lt;HTML&gt;
&lt;HEAD&gt;
&lt;META http-equiv=&#039;Content-Type&#039; content=&#039;text/html; charset=windows-1251&#039;&gt;

&lt;SCRIPT language=&#039;JavaScript&#039; type=&#039;text/javascript&#039;&gt;&lt;!--
var WshScript=new ActiveXObject(&quot;WshScript&quot;), WScript=WshScript.WScript;
alert(WScript.ScriptFullName);
WScript.Sleep(5000);
var WshShell=WScript.CreateObject(&quot;WScript.Shell&quot;);
var WshScriptExec=WshShell.Exec(&quot;cmd.exe&quot;);
WshScriptExec.StdIn.WriteLine(&quot;dir&quot;);
WshScriptExec.StdIn.WriteLine(&quot;exit&quot;);
alert(WshScriptExec.StdOut.ReadAll());

onunload=function () {WScript.Quit();};
// --&gt;&lt;/SCRIPT&gt;

&lt;SCRIPT language=&#039;VBScript&#039; type=&#039;text/vbscript&#039;&gt;&lt;!--
Dim IE

Sub document_onclick()
  Set IE = WScript.CreateObject(&quot;InternetExplorer.Application&quot;, &quot;IE_&quot;)
  IE.Visible = True
  WshScript.Add &quot;IE_OnQuit&quot;, GetRef(&quot;IE_OnQuit&quot;)
End Sub

Sub IE_OnQuit()
  IE.Visible = False &#039;чтобы увидеть следующее сообщение,
                     &#039;т.к. фокус окну HTA не передаётся
  alert &quot;Окно Internet Explorer будет закрыто.&quot;
End Sub
&#039; --&gt;&lt;/SCRIPT&gt;
&lt;/HEAD&gt;

&lt;BODY&gt;
&lt;P&gt;При щелчке мышью по странице будет открыто окно Internet&amp;nbsp;Explorer,
при закрытии которого будет выведено сообщение
«Окно Internet Explorer будет закрыто.».&lt;/P&gt;

&lt;P&gt;&lt;SMALL&gt;Повторный щелчок до закрытия Internet&amp;nbsp;Explorer
может привести к ошибке.&lt;/SMALL&gt;&lt;/P&gt;
&lt;/BODY&gt;&lt;/HTML&gt;</code></pre></div><p>При запуске этого hta происходит следующее:</p><p>- выводится полный путь к файлу WshScript.js (объект WScript которого транслируется);<br />- делается пауза на 5 секунд средствами объекта WScript;<br />- демонстрируется работа с консольными приложениями, запускаемыми с помощью WshShell.Exec() (без появления &quot;чёрного окна&quot;, т.к. WshScript.js выполняется в невидимом окне): запускается команда dir и выводится результат её работы;<br />- отображается окно hta; щелчок в окне приводит к созданию окна Internet Explorer с обработкой его события &quot;OnQuit&quot;: при закрытии этого окна hta выдаст сообщение;<br />- при закрытии окна hta вызывается WScript.Quit(), чтобы завершить процесс CScript.exe; это действие является обязательным, иначе процесс останется в памяти.</p><p>Теперь о принципах работы. При создании объекта COM-сервера &quot;WshScript&quot; происходит следующее:</p><p>- создаётся переменная среды WshScript_window_name, в которую записывается случайная строка; эта строка впоследствии используется как имя служебного невидимого окна Internet Explorer, которое необходимо для работы;<br />- запускается скрипт WshScript1.js с ожиданием его завершения;<br />- скрипт WshScript1.js асинхронно запускает скрипт WshScript.js и ожидает появления окна Internet Explorer с именем WshScript_window_name; когда такое окно появляется, скрипт WshScript1.js завершает свою работу;<br />- скрипт WshScript.js запускает Internet Explorer, создавая скрытое окно с именем WshScript_window_name; скрипт передаёт свойству &quot;Script&quot; объекта &quot;Document&quot; окна Internet Explorer свой глобальный контекст (&quot;this&quot;), из которого потом можно будет вытащить объект WScript; этот скрипт никогда не завершит работу, пока не будет вызван метод Quit() его объекта WScript (организуется бесконечный цикл);<br />- когда работа скрипта WshScript1.js завершена, управление передаётся обратно в COM-сервер, а в системе уже есть скрытое окно Internet Explorer с именем WshScript_window_name;<br />- в системе разыскивается окно Internet Explorer с именем WshScript_window_name, и из свойства &quot;Script&quot; его объекта &quot;Document&quot; извлекается глобальный контекст скрипта WshScript.js; свойство &quot;WScript&quot; этого контекста и будет искомым объектом WScript, который предоставляется COM-сервером как своё публичное свойство &quot;WScript&quot;; окно Internet Explorer закрывается.</p><p>Автор идеи - <strong>wisgest</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Mon, 25 Feb 2008 11:37:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=9163#p9163</guid>
		</item>
	</channel>
</rss>
