<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=1037</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1037&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH: пишем COM-серверы в формате Windows Script Component (WSC)».]]></description>
		<lastBuildDate>Thu, 02 Jan 2014 00:47:39 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=78771#p78771</link>
			<description><![CDATA[<p>Решение из темы «<a href="http://forum.script-coding.com/viewtopic.php?id=9101">AHK: Выполненние JScript-кода с помощью WSC</a>» можно использовать и в других языках программирования, которые в состоянии выступить в качестве OLE-клиента. Например, в VBScript вместо AutoHotkey-функции <em>ComObjGet()</em> надо использовать <em>GetObject()</em>.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Thu, 02 Jan 2014 00:47:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=78771#p78771</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=20441#p20441</link>
			<description><![CDATA[<p>Динамическое создание новых &quot;свойств&quot; объекта на лету, по строковому имени.<br />Код сервера:<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&gt;
&lt;registration progid=&#039;testWSC&#039;/&gt;
&lt;public&gt;&lt;property name=&#039;hash&#039;&gt;&lt;get/&gt;&lt;put/&gt;&lt;/property&gt;&lt;/public&gt;
&lt;script language=&quot;JScript&quot;&gt;&lt;![CDATA[

var hash = {};
function get_hash() {
  if(arguments.length)
    return hash[arguments[0]];
  else
    return hash;
}

function put_hash() { 
  var key = arguments[0], prop = arguments[1];
  hash[key] = prop;
}

]]&gt;&lt;/script&gt;
&lt;/component&gt;</code></pre></div><p>Код клиента (JScript):<br /></p><div class="codebox"><pre><code>var wsc = WSH.CreateObject(&quot;testWSC&quot;);
wsc.hash(&#039;test&#039;) = &#039;one&#039;; // создание нового &quot;свойства&quot;
WSH.echo(wsc.hash(&#039;test&#039;)); // one
WSH.echo(wsc.hash.test); // one

wsc.hash.test = &quot;two&quot;;
WSH.echo(wsc.hash.test); // two

wsc.hash(&quot;test&quot;) = &quot;three&quot;;
WSH.echo(wsc.hash(&quot;test&quot;)); // three</code></pre></div><p>Код клиента (VBScript):<br /></p><div class="codebox"><pre><code>Set wsc = CreateObject(&quot;testWSC&quot;)
wsc.hash(&quot;test&quot;) = &quot;one&quot; &#039; создание нового &quot;свойства&quot;
WSH.echo wsc.hash(&quot;test&quot;) &#039; one
WSH.echo wsc.hash.test &#039; one

wsc.hash.test = &quot;two&quot;
WSH.echo wsc.hash.test &#039; two

wsc.hash(&quot;test&quot;) = &quot;three&quot;
WSH.echo wsc.hash(&quot;test&quot;) &#039; three</code></pre></div><p>Автор решения — <strong>YMP</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Tue, 10 Mar 2009 12:53:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=20441#p20441</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=20393#p20393</link>
			<description><![CDATA[<p>В функциях, которые будут использоваться для чтения и записи объявленного свойства COM-сервера, можно использовать аргументы. Это позволит применять в клиентском скрипте синтаксис &quot;свойств с параметрами&quot;. Например, код сервера:<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&gt;
&lt;registration progid=&#039;testWSC&#039;/&gt;
&lt;public&gt;
    &lt;property name=&#039;testProperty&#039;&gt;&lt;get/&gt;&lt;put/&gt;&lt;/property&gt;
&lt;/public&gt;

&lt;script language=&quot;JScript&quot;&gt;&lt;![CDATA[
var test;

function get_testProperty() {
    return test;
}

function put_testProperty(arg1, arg2) {
    test = arg1 * arg2;
}

]]&gt;&lt;/script&gt;
&lt;/component&gt;</code></pre></div><p>После этого, например, в клиентском JS-скрипте будет вполне допустимо писать что-то вроде:<br /></p><div class="codebox"><pre><code>oTest = new ActiveXObject(&quot;testWSC&quot;)
oTest.testProperty(5) = 3;
WScript.Echo(oTest.testProperty); // 5 * 3 = 15
oTest.testProperty(5, 4) = 3;
WScript.Echo(oTest.testProperty); // 5 * 4 = 20
oTest.testProperty(5, 8, 6) = 3;
WScript.Echo(oTest.testProperty); // 5 * 8 = 40</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Mon, 09 Mar 2009 11:26:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=20393#p20393</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8118#p8118</link>
			<description><![CDATA[<p>Специфические функции, которые можно использовать в коде WSC.</p><p><strong>value = createComponent(componentID)</strong></p><p>Возвращает ссылку на другой COM-объект (с другим ProgID) из этого же самого пакета (wsc-файла). Параметр componentID - уникальный идентификатор (атрибут &quot;id&quot;) компонента. Таким образом, можно использовать функциональные возможности &quot;соседнего&quot; компонента из этого же самого wsc-файла.</p><p><strong>fireEvent(eventName)</strong></p><p>Возбуждает указанное событие. Параметр eventName - имя события, как оно определено в элементе &lt;event&gt;, который должен быть объявлен в элементе &lt;public&gt;.</p><p><strong>value = getResource(resourceID)</strong></p><p>Получает значение ресурса, определенного в элементе &lt;resource&gt;. Параметр resourceID - уникальный идентификатор ресурса в пределах компонента.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sun, 20 Jan 2008 09:56:10 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8118#p8118</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8021#p8021</link>
			<description><![CDATA[<p>Можно использовать в WSC объекты собственных классов, с собственными свойствами и методами, и передавать эти объекты клиентским скриптам. Демонстрация:<br /><strong>C:\Temp\test.wsc</strong><br /></p><div class="codebox"><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;windows-1251&quot; standalone=&quot;yes&quot;?&gt;
&lt;?component error=&quot;true&quot; debug=&quot;true&quot;?&gt;
&lt;component&gt;
&lt;registration progid=&quot;SomeProgId&quot;/&gt;
&lt;public&gt;
    &lt;method name=&quot;Construct&quot;/&gt;
    &lt;method name=&quot;Destruct&quot;/&gt;
&lt;/public&gt;
&lt;script language=&quot;VBScript&quot;&gt;&lt;![CDATA[
    &#039; --------------------------------------------------
    Function Construct()
        Set Construct = New MyClass
    End Function
    &#039; --------------------------------------------------
    Sub Destruct(ByRef objMyClass)
        Set objMyClass = Nothing
    End Sub
    &#039; --------------------------------------------------
    Class MyClass
        Private intX1
        Private intX2
        
        Public Property Let x1(intValue)
            intX1 = intValue
        End Property
        
        Public Property Let x2(intValue)
            intX2 = intValue
        End Property
        
        Public Function Add()
            Add = intX1 + intX2
        End Function
    End Class
]]&gt;&lt;/script&gt;
&lt;/component&gt;</code></pre></div><p>Клиентский скрипт:<br /></p><div class="codebox"><pre><code>Set objWSC = GetObject(&quot;script:C:\Temp\test.wsc&quot;)
Dim objMyClass

WScript.Echo &quot;IsObject(objMyClass): &quot; &amp; IsObject(objMyClass)

Set objMyClass = objWSC.Construct()
boolRes = objMyClass Is Nothing
WScript.Echo &quot;IsObject(objMyClass): &quot; &amp; IsObject(objMyClass), &quot;; objMyClass Is Nothing: &quot; &amp; boolRes

objMyClass.x1 = 2
objMyClass.x2 = 3
WScript.Echo objMyClass.Add()

&#039; Первый путь очистки
&#039;Set objMyClass = Nothing
&#039;boolRes = objMyClass Is Nothing
&#039;WScript.Echo &quot;IsObject(objMyClass): &quot; &amp; IsObject(objMyClass), &quot;; objMyClass Is Nothing: &quot; &amp; boolRes

&#039; Второй путь очистки, через подобие destructor&#039;а
objWSC.Destruct objMyClass
boolResult = objMyClass Is Nothing
WScript.Echo &quot;IsObject(objMyClass): &quot; &amp; IsObject(objMyClass), &quot;; objMyClass Is Nothing: &quot; &amp; boolResult</code></pre></div><p>Благодарность за разъяснения - <strong>alexii</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Thu, 17 Jan 2008 13:54:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8021#p8021</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=8007#p8007</link>
			<description><![CDATA[<p>В WSC можно использовать объект <strong>WScript</strong>, если он передан туда из клиентского сценария. Для этого можно объявить свойство наподобие такого:<br /></p><div class="quotebox"><blockquote><p>&lt;property name=&quot;ScriptingHost&quot; internalName=&quot;WScript&quot;/&gt;</p></blockquote></div><p>Если это свойство правильно установлено клиентским скриптом, при использовании свойств и методов этого объекта в коде WSC они будут работать в контексте клиентского скрипта. Примером может являться компонент <strong>C:\WINDOWS\system32\cmdlib.wsc</strong>, поставляемый с Windows XP. Пример использования:<br /></p><div class="codebox"><pre><code>Set CmdLib = CreateObject(&quot;Microsoft.CmdLib&quot;)
Set CmdLib.ScriptingHost = WScript
WScript.Echo CmdLib.checkScript()</code></pre></div><p>Функция checkScript() вернёт 2 в случае, если клиентский скрипт запущен с помощью cscript.exe, и 0 в остальных случаях.<br />Благодарность за разъяснения - <strong>wisgest</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Thu, 17 Jan 2008 12:05:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=8007#p8007</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=7968#p7968</link>
			<description><![CDATA[<p>С помощью элемента <strong>&lt;?component?&gt;</strong> может быть реализована более углубленная проверка ошибок. Используются два атрибута: <strong>error</strong> и <strong>debug</strong>. Установка <strong>error=&quot;true&quot;</strong> позволит выводить более подробные сообщения об ошибках. Например, при невозможности создания объекта вы получите сообщение типа &quot;Невозможно создание объекта контейнером ActiveX&quot;. Если же атрибут error не задан, вы получите сообщение типа &quot;Неопознанная ошибка&quot;. Установка <strong>debug=&quot;true&quot;</strong> даст возможность пошагового выполнения кода сценария в отладчике - в случае возникновения ошибки будет выдано окно с предложением запустить отладчик (на выбор - из всех отладчиков, установленных в системе). Элемент &lt;?component?&gt; можно задать в начале файла, непосредственно после элемента &lt;?xml?&gt;, например:<br /></p><div class="quotebox"><blockquote><p>&lt;?component error=&quot;true&quot; debug=&quot;true&quot;?&gt;</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 16 Jan 2008 08:15:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=7968#p7968</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=7875#p7875</link>
			<description><![CDATA[<p><strong>Элемент &lt;object&gt;</strong></p><p>Предлагает ещё один способ создания экземпляра COM-объекта внутри сценария, например, аналогично функции CreateObject(). Атрибут <strong>id</strong> - это имя, применяемое для обращения к объекту внутри сценария. Объект, созданный с помощью этого элемента, будет глобальным.</p><p>Атрибуты <strong>progid</strong> и <strong>classid</strong> задают соответственно программный идентификатор и CLSID. Из этих двух атрибутов может быть указан только один.</p><p><strong>Элемент &lt;reference&gt;</strong></p><p>Обеспечивает доступ к мнемоническим константам, определённым в библиотеке типов нужного объекта (экземпляр объекта при этом не создаётся). Это позволяет не запоминать числовые значения констант, к которым постоянно нужно обращаться при написании кода.</p><p>Атрибут <strong>object</strong> задаёт программный идентификатор объекта. При необходимости можно указать версию объекта в атрибуте <strong>version</strong>. Вместо программного идентификатора объекта можно использовать глобальный код его библиотеки типов, задав его в атрибуте <strong>guid</strong>.</p><p>Например:</p><div class="quotebox"><blockquote><p>&lt;reference object=&quot;Scripting.FileSystemObject&quot;/&gt;</p></blockquote></div><div class="quotebox"><blockquote><p>s = ForReading</p></blockquote></div><p><strong>Элемент &lt;script&gt;</strong></p><p>Содержит собственно код скрипта. Атрибут <strong>language</strong> определяет язык (JScript или VBScript).</p><p>Код сценария должен быть помещён в секцию <strong>CDATA</strong>, которая начинается с символов <strong>&lt;![CDATA[</strong> и заканчивается символами <strong>]]&gt;</strong>, чтобы избежать ошибочной интерпретации фрагментов кода как разметки XML. Данное замечание справедливо, только если присутствует элемент &lt;?XML?&gt;, в противном случае присутствие секции CDATA приведёт к ошибке.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 12 Jan 2008 21:06:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=7875#p7875</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=7874#p7874</link>
			<description><![CDATA[<p><strong>Элемент &lt;public&gt;</strong></p><p>Может содержать один или несколько элементов <strong>&lt;property&gt;</strong>, <strong>&lt;method&gt;</strong> или <strong>&lt;event&gt;</strong>.</p><p><strong>Элемент &lt;property&gt;</strong></p><p>Объявляет свойство, которое будет доступно для клиентов автоматизации. Атрибут <strong>name</strong> определяет имя свойства.</p><p>Объявляемое свойство может быть доступно только для чтения, только для записи, или для чтения и записи. Это определяется наличием внутри контейнера &lt;property&gt; элементов <strong>&lt;get/&gt;</strong> и <strong>&lt;put/&gt;</strong>.</p><p>Атрибут <strong>internalName</strong> в элементах &lt;get/&gt; и &lt;put/&gt; задаёт имена функций, которые будут использоваться для чтения и записи свойства соответственно. Эти функции описываются внутри контейнера &lt;script&gt;. Если атрибут internalName не указан, необходимо задать функции <strong>get_PropertyName</strong> и/или <strong>put_PropertyName</strong>, где PropertyName - имя свойства (атрибут name).</p><p><strong>Элемент &lt;method&gt;</strong></p><p>Объявляет метод, который будет доступен для клиентов автоматизации. Атрибут name определяет имя метода. Если не указан атрибут <strong>internalName</strong>, внутри контейнера &lt;script&gt; должна быть описана функция или процедура с таким именем.</p><p>Список параметров метода (если они есть) задаётся внутри элемента &lt;method&gt; с помощью элементов <strong>&lt;parameter&gt;</strong>, каждый из которых должен содержать артрибут name.</p><p><strong>Элемент &lt;event&gt;</strong></p><p>Объявляет событие, которое может обрабатываться клиентами автоматизации. Атрибут <strong>name</strong> определяет имя события.</p><p>Атрибут <strong>dispid</strong> может содержать числовой идентификатор интерфейса события.</p><p>Чтобы вызвать наступление события, внутри элемента &lt;script&gt; используется функция <strong>fireEvent()</strong>, с именем нужного события в качестве параметра.</p><p><strong>Элемент &lt;resource&gt;</strong></p><p>Позволяет отделить символьные или числовые константы от остального кода сценария. Для получения значения ресурса нужно вызвать метод <strong>getResource</strong>, передав в качестве параметра символьный идентификатор ресурса (значение атрибута <strong>id</strong>). Например:</p><div class="quotebox"><blockquote><p>&lt;resource id=&quot;ver&quot;&gt;0.001&lt;/resource&gt;</p></blockquote></div><div class="quotebox"><blockquote><p>Ver = getResource(&quot;ver&quot;)</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 12 Jan 2008 20:52:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=7874#p7874</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=7873#p7873</link>
			<description><![CDATA[<p>Обязательными для создания компонента-сценария являются элементы <strong>&lt;component&gt;</strong>, <strong>&lt;registration&gt;</strong>, <strong>&lt;public&gt;</strong> и <strong>&lt;script&gt;</strong>.</p><p><strong>Комментарии</strong></p><p>Комментарии вставляются двумя способами:<br /></p><div class="quotebox"><blockquote><p>&lt;!-- Первый комментарий --&gt;</p></blockquote></div><div class="quotebox"><blockquote><p>&lt;comment&gt;Второй комментарий&lt;/comment&gt;</p></blockquote></div><p><strong>Элемент &lt;?XML?&gt;</strong></p><p>Этот элемент размещается в самом начале файла - никаких других символов или пустых строк перед ним быть не должно. Чтобы использовать в файле символы кириллицы, обязательно должен быть указан атрибут <strong>encoding</strong>, например:<br /></p><div class="quotebox"><blockquote><p>&lt;?xml version=&#039;1.0&#039; encoding=&#039;windows-1251&#039;?&gt;</p></blockquote></div><p><strong>Элемент &lt;package&gt;</strong></p><p>Может содержать один или несколько элементов <strong>&lt;component&gt;</strong>. Необходим тогда, когда с помощью элементов &lt;component&gt; нужно определить более одного компонента. Если описывается только один компонент, элемент &lt;package&gt; можно не использовать.</p><p><strong>Элемент &lt;component&gt;</strong></p><p>Описывает COM-объект. Необязательный атрибут <strong>id</strong> определяет идентификатор объекта, если в одном WSC-файле находятся несколько COM-объектов. Элемент &lt;component&gt; должен содержать один элемент <strong>&lt;registration&gt;</strong> и один элемент <strong>&lt;public&gt;</strong>.</p><p><strong>Элемент &lt;registration&gt;</strong></p><p>Содержит информацию для регистрации COM-объекта в системе. Атрибуты <strong>progid</strong> и <strong>classid</strong> задают соответственно программный идентификатор и CLSID. Из этих двух атрибутов обязательно должен быть указан хотя бы один. Если classid не указан, этот код может оказаться различным при регистрации объекта на разных машинах.</p><p>Атрибут <strong>description</strong> может задавать краткое описание объекта, которое при регистрации попадёт в реестр.</p><p>Атрибут <strong>version</strong> позволяет указать номер версии COM-объекта. Этот номер позволяет запрашивать из приложения определённую версию COM-объекта, например, &quot;MyClass.MyObject.1&quot;.</p><p>C помощью элемента <strong>&lt;script&gt;</strong> внутри контейнера <strong>&lt;registration&gt;</strong> можно указать две функции, одна из которых будет вызываться при регистрации объекта в системе, а другая - при удалении объекта из системы. Эти функции должны иметь имена соответственно <strong>Register()</strong> и <strong>Unregister()</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 12 Jan 2008 20:23:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=7873#p7873</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=7872#p7872</link>
			<description><![CDATA[<p>С помощью технологии Windows Script Components можно зарегистрировать в системе COM-объект, написанный на языке JScript или VBScript. Любой сценарий WSH можно упаковать в COM-объект и использовать его в приложениях, написанных на любом языке, который позволяет подключать подобные внешние объекты.</p><p>Механизм работы объектов-сценариев базируется на технологии ActiveX Scripting. Основную роль здесь играет динамическая библиотека <strong>scrobj.dll</strong>, которая является оболочкой компонентов-сценариев и отвечает за функционирование файла-сценария в качестве COM-объекта. Оболочка компонентов-сценариев scrobj.dll отвечает за то, чтобы при вызове из внешнего приложения метода объекта-сценария или обращении к его свойству запускалась соответствующая функция, описанная в этом сценарии.</p><p>При регистрации объекта-сценария в разделе реестра <strong>HKEY_CLASSES_ROOT\CLSID\</strong> создаётся новый подраздел, название которого совпадает с CLSID регистрируемого объекта. В этом подразделе создаётся подраздел <strong>InprocServer32</strong>, значением по умолчанию которого является полный путь к библиотеке scrobj.dll. Кроме того, там же создаются подразделы <strong>ProgID</strong> (программный идентификатор объекта) и <strong>ScriptletURL</strong> (полный путь к файлу объекта-сценария).</p><p>При создании экземпляра объекта из внешнего приложения в разделе реестра <strong>HKEY_LOCAL_MACHINE\SOFTWARE\Classes\</strong> ищется подраздел с именем, которое совпадает с программным идентификатором объекта (такой подраздел создаётся при регистрации объекта-сценария). Определяется CLSID объекта (соответствующий параметр найденного подраздела). После этого разыскивается подраздел с именем, которое совпадает с найденным CLSID объекта, в разделе реестра HKEY_CLASSES_ROOT\CLSID\. По значению подраздела <strong>InprocServer32</strong> загружается scrobj.dll, которая в свою очередь уже загружает файл самого сценария, используя значение подраздела <strong>ScriptletURL</strong>.</p><p>Компоненты-сценарии, реализованные по технологии Windows Script Components, представляют из себя файлы с расширениями <strong>wsc</strong> (или <strong>sct</strong>), которые содержат специальную XML-разметку (объектная модель WSC XML).</p><p>Одним из главных преимуществ WSC является возможность повторного использования кода. Такие компоненты могут свободно использоваться в других сценариях, а также в любых языках программирования, поддерживающих технологию COM и способных выступить в роли OLE-клиента.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 12 Jan 2008 19:30:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=7872#p7872</guid>
		</item>
		<item>
			<title><![CDATA[WSH: пишем COM-серверы в формате Windows Script Component (WSC)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=7851#p7851</link>
			<description><![CDATA[<p>Пример создания минимального COM-сервера Windows Script Component (WSC). Код компонента (сохраните как файл .wsc):<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&gt;
&lt;registration progid=&#039;FoldersTreeEnumerator&#039;/&gt;
&lt;public&gt;
  &lt;method name=&#039;ConnectToFolder&#039;/&gt;
  &lt;method name=&#039;item&#039;/&gt;
  &lt;method name=&#039;atEnd&#039;/&gt;
  &lt;method name=&#039;moveNext&#039;/&gt;
&lt;/public&gt;

&lt;object id=&#039;fso&#039; progid=&#039;Scripting.FileSystemObject&#039;/&gt;

&lt;script language=&quot;JScript&quot;&gt;&lt;![CDATA[
var Item, Top;

function ConnectToFolder(FolderPath) {
  Item=fso.GetFolder(FolderPath);
  Top=null;
}

function item() {return Item;}

function atEnd() {return !Item;}

function moveNext() {
  Top={
    SubFolders: new Enumerator(Item.SubFolders),
    Parent: Top
  };
  while (!(Item=Top.SubFolders.item())) {
    if (!(Top=Top.Parent)) return;
    Top.SubFolders.moveNext();
  }
}
]]&gt;&lt;/script&gt;
&lt;/component&gt;</code></pre></div><p>Зарегистрируйте компонент командой наподобие следующей:<br /></p><div class="quotebox"><blockquote><p>regsvr32 &quot;%SystemRoot%\system32\test.wsc&quot;</p></blockquote></div><p>Пример скрипта, использующего компонент (рекурсивно выведет подкаталоги каталога C:\Temp):<br /></p><div class="codebox"><pre><code>Set t = CreateObject(&quot;FoldersTreeEnumerator&quot;)
t.ConnectToFolder &quot;C:\Temp&quot;
While Not t.atEnd()
  WScript.Echo t.item().Path
  t.moveNext
Wend</code></pre></div><p>Автор примера - <strong>wisgest</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 11 Jan 2008 18:46:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=7851#p7851</guid>
		</item>
	</channel>
</rss>
