Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Иван Коробко
Создаём COM-компоненты с помощью VBScript
Вы пишете много скриптов, и надоело переносить код из одного файла в другой? Есть отличное решение – создать COM-объекты на основе своих сценариев.
В 1993 году компанией Microsoft был разработан стандарт COM (Component Object Model – объектная модель компонентов), предназначенный для создания программного обеспечения на основе взаимодействия различных компонентов. Основным понятием, которым оперирует технология COM, является COM-компонент, имеющий уникальный идентификатор (GUID).
Взаимодействие компонентов осуществляется с помощью COM-интерфейса – набора абстрактных свойств и функций (COM-объекты). Доступ к COM-объектам осуществляется с помощью функций Windows API. Основное преимущество заключается в возможности использовать одни и те же COM-объекты в различных языках программирования, ускорить создание приложений.
Основная задача разработчиков COM-объектов – создание компонентной архитектуры, совместимой со скриптовыми языками. Это дает возможность использовать функции COM-компонентов, написанных на различных языках программирования (VB.NET, C++, C#), в том числе и на скриптовых (VBScript, JScript, PerlScript). Использование Windows Script Components (WSC) позволяет создавать сценарии на базе cкриптовых языков, которые можно использовать в качестве COM-объектов.
В качестве примера создадим COM-объект Detect.Domain, который содержит несколько методов. Используя их, можно определить длинное имя домена (DC=Microsoft,DC=Com), короткое имя домена (Microsoft) и DNS-имя домена (Microsoft.Com).
Поставленная задача решается в два этапа. На первом этапе создают WSC-файл, который на втором этапе внедряется в систему.
WSC-файлы
WSC-файл – это XML-файл, созданный по определенным правилам и содержащий скриптовые вставки. XML (eXtensible Markup Language) – расширяемый язык разметки, предназначенный для хранения структурированных данных. В большинстве случаев WSC-файл запускается из командной строки с параметром:
restart.wsc /action:restart
Windows Script Component Wizard
Создать WSC-файл можно вручную, с помощью любого редактора сценариев или мастера, созданного компанией Microsoft – Windows Script Component Winzard (http://www.microsoft.com/downloads/details.aspx?familyid=408024ED-FAAD-4835-8E68-773CCC951A6B&displaylang=en).
После завершения процесса установки мастера в меню «Пуск -> Программы -> Microsoft Windows Script» запустите Windows Script Component Winzard. Этот мастер предложит создать WSC-файл за 6 шагов.
Шаг 1. Define Windows Script Component Object
На первом шаге работы мастера пользователь определяет параметры создаваемого объекта. Первый параметр (Name) – имя объекта, которое является составной частью ID и автоматически добавится в качестве префикса в значении поля Prog ID (см. рис. 1).
Рисунок 1. WSC Wizard. Шаг 1
Сформированное значение Prog ID – имя объекта, которое участвует при вызове COM-объекта:
Set obj=CreateObject("Detect.Domain")
Значения второго (FileName) и пятого (Location) параметров задают точное местоположение и имя создаваемого файла.
Четвертым параметром (Version) описывается используемая версия XML в WSC-файле:
<?xml version="1.0" encoding="UTF-8"?>
На основе указанной информации в WSF-файл формируется раздел <registration>:
<?xml version="1.0"?>
<component>
<registration
progid="Detect.Domain"
version="1.00"
classid="{fda8dd3e-b1b2-4871-aec5-1fa530dc8f6a}"
>
</registration>
…
</component>
Замечание: если WSC-файл создается вручную, то понадобится уникальный GUID, который можно сгенерировать на сайте http://www.famkruithof.net/uuid/uuidgen.
После того как все поля заполнены, кнопка «Next» станет активна, и можно будет перейти к шагу 2.
Шаг 2. Specify characteristics
На этом этапе задаются специфические параметры (см. рис. 2), касающиеся используемого языка, осуществляется настройка обработчика ошибок. С помощью первого параметра (What language do you want to use?) определяется скриптовый язык, используемый в разделе <script> WSC-файла.
Рисунок 2. WSC Wizard. Шаг 2
Им может быть VBScript, JScript или другой, например PerlScript:
<?xml version="1.0" encoding="UTF-8"?>
<component>
…
</component>
Вторым параметром определяется внутренний формат создаваемого файла. Будет ли он совместим с DHTML или с ASP. По умолчанию включена настройка совместимости с DHTML.
С помощью оставшихся параметров осуществляют настройку обработчика ошибок. При включенном первом параметре (Error checking) осуществляется проверка на наличие ошибок, при включенном втором параметре (Debugging) – обработка и отладка ошибок.
В листинге WSC-файла настройки обработчика ошибок находятся в теге <?component?>:
<?xml version="1.0" encoding="UTF-8"?>
<component>
<?component error ="true" debug="false" ?>
…
</component>
Если необходимо создать несколько компонентов в одном файле, то теги <component> идентифицируют с помощью уникального идентификатора – ID и помещают в тег <package>. Эта необходимость обусловлена синтаксисом формата XML-файлов, на основе которого создан WSC-файл:
<?xml version="1.0" encoding="UTF-8"?>
<package>
<component id="Part1">
…
</component>
<component id="Part2">
…
</component>
…
</package>
К сожалению, с помощью WSC Wizard невозможно создать многокомпонентный файл.
Шаг 3. Add Windows Script Component Properties
На третьем шаге задаются свойства компонентов (см. рис. 3), объявляются переменные и константы, которые будут использоваться на следующем шаге при описании методов.
Рисунок 3. WSC Wizard. Шаг 3
Каждая переменная имеет один из трех статусов: чтение, запись и чтение-запись.
Например, необходимо преобразовать заданное имя домена (DC=Microsoft,DC=Com) в короткое имя (Micsrosoft.Com). Листинг WSC-файла будет выглядеть примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<component>
<registration>
<property domain>
<get/>
<put/>
</property>
<script>
dim domain
function get_()
get_domain = domain
end function
function put_domain(newValue)
domain = newValue
end function
</script>
…
</component>
Соответствующий ему листинг на VBScript следующий:
Set obj=CreateObject("Detect.Domain")
Obj.Domain = InputBox("Введите имя домена \n (LDAP://DC=Micrisoft.COM)")
Шаг 4. Add Windows Script Component methods
На четвертом шаге декларируются имена функций и названия параметров, которые будут вызываться в качестве методов объекта. Создадим метод LongToDNS, который при заданном значении длинного имени домена (DC=Microsoft,DC=Ru), возвращает его DNS-имя (Microsoft.Ru). Задаваемый параметр (domain) – длинное имя домена (см. рис. 4).
Рисунок 4. WSC Wizard. Шаг 4
В WSC-файле метод описывается внутри обязательного тега <public> с помощью тега <method>:
<method>:
<public>
<method name="LongToDNS">
<PARAMETER name="domain"/>
</method>
</public>
После декларации метода, в теге <script> нужно объявить одноименную функцию, аргументом которой будет указанный параметр:
<script language="VBScript">
<![CDATA[
Function LongToDNS(domain)
DomainArray=Split(domain,",")
temp=""
For Each element In DomainArray
temp=temp+right(element,Len(element)-3)+"."
Next
LongToDNS=Left(temp,Len(temp)-1)
End Function
]]>
</script>
Остальные функции не имеют никаких параметров: определяют имя текущего домена. Полная версия листинга WSC-файла размещена на сайте журнала www.samag.ru в разделе «Исходный код».
Замечание: методы, свойства и события приписывают в WSC-файле вручную в разделе <script> после окончания работы мастера.
Листинг VBS-файла, использующего создаваемый COM-объект, будет следующим:
Set obj=CreateObject("Detect.Domain")
Wscript.Echo obj.LongToDNS("DC=Microsoft,DC=RU")
Шаг 5. Add Windows Script Component events
На этом шаге описывается третий тип параметров – events (см. рис. 5). Этот шаг обычно пропускается, поскольку события не востребованы в сценариях. Достаточно часто используется при создании HTML- и ASP-страниц.
Рисунок 5. WSC Wizard. Шаг 5
Шаг 6. That’s all we need!
На заключительном этапе приводится информация о характеристиках создаваемого WSC-файла на основе введенных параметров (см. рис. 6).
Рисунок 6. WSC Wizard. Шаг 6
Модернизация WSC-шаблона
После того как WSC-файл создан, необходимо снабдить его комментариями, добавить необходимые функции и процедуры.
Комментарий
Комментарий помещают внутрь тега <comment>, расположенного в элементе <package> на одном уровне с <component>, или в элементе <component>, если он родительский. Местоположение комментария внутри оговоренных элементов не имеет значения.
Вариант А:
<?xml version="1.0" encoding="UTF-8"?>
<package>
<comment>
Это комментарий файла
</comment>
<component id="Part1">
…
</component>
<component id="Part2">
…
</component>
…
</package>
Вариант Б:
<?xml version="1.0" encoding="UTF-8"?>
<component>
<comment>
Это комментарий файла
</comment>
…
</component>
Функции в WSC-файл
С помощью WSC Wizard невозможно добавить в файл каких-либо функций. Предлагаемый Microsoft мастер создает шаблон, в котором декларированы переменные и объявляются функции.
После работы мастера нужно добавить функции в файл в раздел <script>:
<?xml version="1.0"?>
<component>
…
<public>
<method name="LongToDNS">
<PARAMETER name="Domain"/>
</method>
</public>
<implements type="Behavior" id="Behavior"/>
<script language="VBScript">
<![CDATA[
function LongToDNS(Domain)
DomainArray=Split(domain,",")
For Each a In DomainArray
temp=temp+right(a, Len(a)-3)+"."
Next
LongToDNS=Left(temp,Len(temp)-1)
end function
]]>
</script>
</component>
Импорт пространств имен
WSC-файлы, как и XML, конечно же, не знают о других объектах. Чтобы сделать их доступными, необходимо осуществить импорт пространства имен с помощью раздела <reference>, расположенного перед разделом <registration>:
<?xml version="1.0"?>
<component>
…
<registration>
…
</component>
В разделе <script>, как в традиционном VBScript, осуществляется вызов функции:
<script>
Function Save(PathToFile, WriteData)
set obj = CreateObject("Scripting.FileSystemObject")
set fso = obj.CreateTextFile(PathToFile, True, TRUE)
fso.WriteLine(WriteData)
fso.Close
</script>
Регистрация COM-объекта
Зарегистрировать созданный компонент в качестве COM-объекта можно несколькими способами.
Первый способ
Самый часто используемый способ – зарегистрировать его как псевдо-Com-объект, выбрав в контекстном меню WSC-файла «Register», или «Подключить», в зависимости от версии Windows (см. рис. 7).
Рисунок 7. Регистрация WSC-файла как COM-компонента
После успешной регистрации выдается соответствующее сообщение. В реесте Windows в кусте HKEY_CLASSES_ROOT\CLSID появляется папка, имя которой совпадает с GUID, указанном в разделе <register> (cм. рис. 8).
Рисунок 8. Регистрация COM-объекта в реестре
Второй способ
Второй способ предпочтительнее, однако он более сложный. Суть заключается в том, что на основе WSC-файла создают TLB-файл, который затем преобразовывают в DLL-библиотеку, которая является полноценным COM-объектом.
Для регистрации TLB-файла выберите в контекстном меню WSC-файла опцию «Generate Type Library». В результате вызова этой команды будет сгенерирован файл scriptlet.tlb. Если в файле присутствует тег <implements>, будет выведено сообщение с синтаксисом команды (см. рис. 9).
Рисунок 9. Создание TLB-файла
После того как создана библиотека, необходимо преобразовать ее в DLL-файл с помощью команды:
Tlbimp.exe scriptlet.tlb
Синтаксис утилиты Type Library Exporter (Tlbimp.exe) можно найти на сайте Microsoft: http://msdn2.microsoft.com/en-us/library/tt0cf3sx(VS.80).aspx. После создания библиотеки ScriptletTypeLib.dll ее необходимо переименовать и зарегистрировать с помощью утилиты regsvr32.exe:
regsvr32.exe /s
Третий способ
Самый простой: с WSC-файлами можно работать без регистрации. Необходимо знать только имя и местоположение файла. Вызов функций осуществляется с помощью функции GetObject():
Set obj = GetObject("script:C:\Example\DDN.wsc")
Wscript.Echo obj.LongToDNS("DN=Microsoft,DN=Com"
Вызов COM-объекта
Созданный COM-объект вызывают с помощью функции CreateObject():
Set obj=createobject("Detect.Domain")
Wscript.Echo obj.LongToDNS("DN=Microsoft,DN=Com")
Заключение
Научившись создавать и регистрировать COM-компоненты из WSC-сценариев различными способами, вы откроете себе новые горизонты в программировании сценариев, которые позволят быстро создавать качественные программы, обладающие значительным функционалом.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|