□ При регистрации объекта-сценария в разделе HKEY_CLASSES_ROOT\CLSID системного реестра создается новый подраздел, название которого совпадает с глобальным кодом (CLSID) регистрируемого объекта. В этом новом разделе создается подраздел InprocServer32, значением по умолчанию которого является полный путь к библиотеке Scrobj.dll. Кроме InprocServer32, создаются подразделы ProgID (программный идентификатор объекта) и ScripletURL (полный путь к файлу объекта-сценария).
□ Если создание экземпляра объекта из внешнего приложения происходит с помощью программного идентификатора (ProgID) объекта, то сначала определяется глобальный код (CLSID) этого объекта. Для этого в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes ищется подраздел с именем, которое совпадает с программным идентификатором объекта (этот подраздел создается при регистрации объекта-сценария), и в качестве глобального кода берется значение параметра CLSID из этого подраздела.
□ По известному глобальному коду объекта происходит поиск раздела с нужным названием в HKEY_CLASSES_ROOT\CLSID, после чего определяется значение подраздела InprocServer32 (путь к библиотеке Scrobj.dll) и загружается оболочка компонентов-сценариев Scrobj.dll.
□ Библиотека Scrobj.dll загружает указанный в подразделе ScripletURL файл со сценарием и перенаправляет вызовы методов объекта в этот сценарий.
Таким образом, нам остается лишь научиться правильным образом создавать файлы с исходным кодом компонентов-сценариев и регистрировать эти файлы в системе в качестве СОМ-объектов.
Компоненты-сценарии, реализованные в технологии Windows Script Components, представляют из себя файлы с расширениями wsc (WSC-файлы), которые содержат специальную XML-разметку (объектная модель WSC XML), к описанию которой мы и перейдем.
Схема WSC XML
Ранее в главе 3 отмечалось, что объектная модель, которая используется при создании многозадачных сценариев (WS-файлов), была в основном позаимствована из схемы WSC XML, поэтому многие элементы WSC-файлов окажутся вам знакомыми.
В листинге 10.1 приводится несколько упрощенная (некоторые необязательные атрибуты у XML-элементов опущены) схема, поясняющая иерархию и порядок появления элементов в WSC-файле.
<?xml version="1.0" encoding="windows-1251"?>
<package>
<component [id="ComponentID"]>
<registration progid="ProgID" class id="GUID" [description="Description"] [version="Version"]>
<script>
Сценарии подключения и отключения
</script>
</registration>
<public>
<property name="PropertyName">
<get [internalName="getFunctionName"]/>
<put [internalName="getFunctionName"]/>
</property>
<method name= "MethodName" [internalName="FunctionName"]>
<parameter name="ParameterID"/>
</method>
<event name="Name" [dispid="DispID"]/>
</public>
<resource id="ResourceID"> Строка или число </resource>
<object id="ObjID" [classld="clsid:GUID"|progid="ProgID"]/>
<reference [object="ProgiD"|guid="typelibGUID"][version="version"]/>
<script language="language">
<![CDATA[
Код сценария
]]>
</script>
</component>
Другие компоненты
</package>
Несколько замечаний относительно количества вхождений различных XML-элементов из листинга 10.1 в WSC-файл:
□ элемент <package> может содержать один или несколько элементов <component>;
□ элемент <component> должен содержать один элемент <registration> и один элемент <public>;
□ элемент <public> может содержать один или несколько элементов <property>, <method> или <event>.
Обязательными для создания компонента-сценария являются элементы <component>, <registration>, <public> и <script>.
Опишем теперь элементы XML, использующиеся в WSC-файлах, более подробно.
Элементы WSC-файла
В WSC-файлы можно вставлять комментарии двумя разными способами: с помощью элемента <!-- --> или элемента <comment>. Например: