Как мы видим из листинга 10.3, при использовании в компоненте-сценарии языка JScript в результате работы мастера внутрь контейнера <script>
помещаются:
? глобальные переменные, которые соответствуют объявленным в элементах <property>
свойствам;
? заготовки функций с префиксами get_
и put_
, которые осуществляют чтение и запись свойств объекта;
? заготовки функций, которые соответствуют объявленным в элементах <method>
методам.
Кроме этого, создается экземпляр внутреннего объекта, содержащего те же свойства и методы, что были описаны внутри элемента <public>
(переменная description
). Имя этого внутреннего объекта совпадает с именем класса описываемого СОМ-объекта (в нашем случае это 'DateArc
').
Создаваемый мастером внутренний объект нужен только в иллюстративных целях, т.к. здесь наглядно видно, какие именно свойства и методы будет предоставлять клиентам автоматизации компонент-сценарий. Если убрать из контейнера <script>
описание внутреннего объекта, это никак не скажется на функционировании объекта-сценария.
Доработка объекта-сценария DateArc.wsc (JScript)
Для получения нужного нам СОМ-объекта из сформированного с помощью Windows Script Component Wizard файла DateArc.wsc нужно выполнить несколько шагов.
Во-первых, для того, чтобы использовать внутри описания СОМ-объекта символы кириллицы, необходимо добавить в директиву <?xml?>
аргумент encoding='windows- 1251'
(без этого в сценарии не удастся даже написать по-русски комментарии):
<?xml version='1.0' encoding='windows-1251'?>
Во-вторых, в контейнер <registration>
мы вставим элемент <script>
с двумя функциями Register()
и Unregister()
, которые будут выводить на экран диалоговые окна с соответствующей информацией при регистрации компонента-сценария и его отключении соответственно:
<script language='JScript'>
<![CDATA[
var WshShell;
//Инициализируем константы для диалоговых окон
var vbInformation=64;
function Register() {
//Создаем объект WshShell
WshShell = new ActiveXObject('WScript.Shell');
WshShell.Popup('Компонент зарегистрирован в системе',0,
'Компонент для архивирования файлов',vbInformation);
}
function Unregister() {
//Создаем объект WshShell
WshShell = new ActiveXObject('WScript.Shell');
WshShell.Popup('Компонент удален из системы', 0,
'Компонент для архивирования файлов',vbInformation);
}
]]>
</script>
Затем нам понадобятся две дополнительные функции. Первая из них NowIs()
формирует строку формата ММДД, где ММ — текущий месяц, ДД — текущий день:
//Вспомогательная функция для символьного представления даты
function NowIs() {
var d, s='', s1='';
//Создаем объект Date (текущая дата)
d=new Date();
//Выделяем номер месяца
s+=(d.getMonth()+1);
//Если месяц представляется одним символом, добавляем слева '0'
if (s.length==1) s='0'+s;
//Выделяем в дате день
s1+=d.getDate();
//Если день представляется одним символом, добавляем слева '0'
if (s1.length==1) s1='0'+s1;
s+=s1;
//Возвращаем сформированную строку
return s;
}
Вторая функция CheckPath()
будет проверять наличие исходного каталога и каталога для хранения архивных файлов. Для этого используется метод FolderExists()
объекта FileSystemObject
. Заметим, что сам объект FileSystemObject
нужно создавать не путем вызова метода CreateObject
объекта WScript
, а с помощью конструкции new ActiveXObject()
:
FSO=new ActiveXObject('Scripting.FileSystemObject');
т.к. в отличие от обычного сценария WSH в компоненте-сценарии нет встроенного объекта WScript
. Если хотя бы один из каталогов не существует, функция CheckPath()
запишет соответствующее сообщение в свойство SErrMess
и вернет значение false
, в противном случае функция CheckPath()
возвращает значение true
.
//Проверка доступности каталогов
function CheckPath() {
var FSO;
//Создаем объект FileSystemObject
FSO=new ActiveXObject('Scripting.FileSystemObject');
//Проверяем доступность исходного каталога
if (!FSO.FolderExists(SFrom)) { //Исходный каталог не существует
//Формируем строку с информацией об ошибке
SErrMess='Не найден исходный каталог '+SFrom;
return false;
}
//Проверяем доступность каталога для архивирования
if (!FSO.FolderExists(SArch)) {
//Каталог для архивирования не существует
//Формируем строку с информацией об ошибке
SErrMess='Не найден каталог для хранения архивов '+SArch;