Алистер Лу-Норрис

ActiveX COM компоненты

Управляющие элементы ActiveX, Active X COM - это удобный инструмент, который можно использовать в своих сценариях. Например, один из модулей управления от Microsoft, называемый DSOleFile, позволяет читать и изменять свойства файла документа Microsoft Office на компьютере, на котором отсутствует установленная версия Microsoft Office. Другой модуль управления, также от Microsoft, называемый ScriptPW, позволяет вводить пароль в сценарий без отображения этого пароля на экране. Модули ActiveX COM не ограничиваются только компонентами от Microsoft. Многие модули для Office доступны от третьих фирм, например компонент WaitFor от компании ServerObject. Этот компонент позволяет прерывать выполнение сценария на заданное время. Давайте посмотрим, как можно использовать DSOleFile, ScriptPW, и WaitF в своих сценариях.

DSOleFile

В Windows Server 2003 и Windows XP, можно использовать компонент DSOleFile, позволяющий написать сценарии, которые читают и изменяют свойства документов Office, либо файлов Microsoft Excel, без запуска Office напрямую. Эта функциональность удобна в случае, если необходимо изменять свойства таких файлов, но вы не имеете установленного Office на компьютере, которым вы пользуетесь. Эта ситуация типична для серверов. Многие системные администраторы не желают устанавливать Office на сервера, исходя из соображений сокращения нецелевого использования и распространения вирусов. При помощи компонента можно управлять свойствами офисных документов без покупки лицензий на офис и получить большую гибкость там, где можно запускать ваш сценарий.

Можно загрузить самораспаковывающийся исполняемый файл компонента DSOleFile, dsofile.exe, с Web-сайта Microsoft http://support.microsoft.com/?kbid=224351. Когда исполняемый файл запустится, программа установки скопирует компонент в указанное вами место и автоматически установит его. Программа установки создаст два раздела в реестре HKEY_CLASSES_ROOTDSOleFile.PropertReader и HKEY_CLASSES_ROOTDSOleFile вместе со связанными с ними подразделами, параметрами и их значениями.

Для компонента DSOleFile имеется необходимая документация. В дополнение к вышеупомянутому Web-сайту, Object Browser в Word или другом приложении Office предоставляет информацию о функциональности компонента. Ссылка, которую нужно добавть в Object Browser - это DS: OLE Document Properties 1.4 Object Library. Если вы не знакомы с тем, как пользоваться Object Browser, посмотрите врезку "Как проверить компоненты, используя Words Object Browser".

Другое место, где можно найти информацию о функциональности компонента - это папка c:dsofilevbtest. Эта папка содержит в себе демонстрацию проекта DS:OLE Document Properties и рабочую область, которую можно открыть в Visual Studio (VS). Можно воспользоваться другой средой разработки, способной читать файлы Visual Basic (VB). Если вы хотите просмотреть некоторые из VB-кодов проекта, а у вас отсутствует VS или другая среда IDE, попробуйте открыть файл FileProp.frm. Этот файл может быть противоречивым, поскольку он описывает Windows-формы для отображения на экране и имеет мало общего с некоторыми VB кодами, использованными разработчиками DSOleFile.

Сценарий DocPropTester.vbs, показанный в листинге 1, демонстрирует как использовать компонент DSOleFile в коде VBScript. Этот сценарий читает некоторые из доступных свойств файла Word, и затем добавляет заданные свойства в этот файл.

DocPropTester.vbs начинается с объявления переменных и их инициализации, переменной strFile, присваивая ей значение, представляющее из себя путь к документу Word. Затем сценарий создает обект DSOleFile PropertyReader и сохраняет ссылку на этот объект в переменной objFilePropReader. Сценарий вызывает метод GetDocumentProperties объекта PropertyReader, который возвращает объект DocumentProperties, и сохраняет ссылку на него в переменной objDocProp. В листинге1 во фрагменте A представлен код, который используется для чтения свойств документа Word. Если вы работали со свойствами файла ранее, то они хорошо известны. Они включают в себя следующие параметры: Name, Author и WordCount, значениями которых являются, соответственно, имя документа, автор и количество слов в документе.

Далее сценарий использует метод Add объекта Custom Properties для добавления нового произвольного свойства файла с именем TestProp и задает его значение. Затем функция MsgBox VBScript выводит на экран все ранее присвоенные свойства документа, по одному на каждой строке. Если какое-либо свойство не имеет заданного значения, сценарий отобразит пустую строку.

Наконец, в цикле For Each...Next, сценарий проходит по всем дополнительно заданным свойствам и отображает каждое из них и его значение в отдельном окне сообщений. Перед тем, как вывести на экран значение дополнительного свойства, сценарий конвертирует его значение в строковый тип на случай, если оно будет использоваться где-нибудь еще.

Если вы хотите изменить значения существующего свойства, то придется включить в сценарий строку, подобную следующей:

objDocProp.Comments = "AGLN"

Приведенный код изменяет значение свойства Comments на строку AGLN.Чтобы запустить сценарий DocPropTester.vbs из командной строки, воспользуйтесь командой:

cscript.exe DocPropTester.vbs

ScriptPW

Windows 2003 и XP включает в себя новый COM-компонент, называемый ScriptPW, он позволяет создавать объект Password, маскирующий пароли от просмотра. Этот объект является частью файла scriptpw.dll, который можно найти в папке C:windowssystem32. Этот компонент будет работать и в Windows 2000, если вы скопируете scriptpw.dll в систему и воспользуетесь regsvr32.exe для регистрации этой библиотеки DLL, как COM-компонента. Предположим, что вы разместили scriptpw.dll в папке C:windowssystem 32. Теперь для регистрации DLL можно воспользоваться следующей командой :

C:windowssystem32
egsvr32.exe
C:windowssystem32scriptpw.dll

Хотя эта команда здесь представлена в виде двух строк, вы должны вводить ее одной строкой. То же самое справедливо и для остальных многострочных команд, встречающихся в этой статье.

Scriptpw.dll не является официальной частью объектной модели Windows Script Host (WSH) 5.6, тем не менее можно использовать ее в своих WSH -сценариях. Компонент ScriptPW работает как считыватель пароля и позволяет набирать на клавиатуре важные данные без их отображения на экране. Этот элемент управления полезен тем, что он обеспечивает раннее отсутствовавшую функциональность. При всех достоинствах, у компонента имеются отрицательные нюансы его использования. Первый - это то, что компонент не работает в графическом интерфейсе. Таким образом, он доступен только для сценариев консольных экранов, запущенных под управлением. cscript.exe. Второй нюанс: компонент перехватывает весь набранный текст без вывода пользователю каких-либо сообщений. По сути, он выводит пользователю на экран в ответ на ввод пароля неподвижный, моргающий курсор. Компонент не выводит при вводе звездочек, как это сделано в большинстве программ. Несмотря на все сказанное, ScriptPW является важным и нужным компонентом для использования в сценариях.

В листинге 2 приведен сценарий SimplePasswordMask.vbs, демонстрирующий возможности использование компонента ScriptPW. После того, как в сценарии объявляются переменные, сценарий создает объект Password и сохраняет ссылку на него в переменной objPassword. Затем сценарий выводит сообщение Please enter your password: (Введите пароль) в стандартный вывод, т.е. в консольное окно. Новая строка в конце этого текста не выводится. Когда пользователь вводит свой пароль, ничего, кроме моргающего курсора на экране не появляется. Метод GetPassword объекта Password возвращает пароль. Как показано во фрагменте A в листинге 2, сценарий заканчивается отображением пустой строки, следующей за вводом пароля пользователем, показывая тем самым, что сценарий действительно воспринял пароль.

Для проверки этого компонента можно воспользоваться сценарием SimplePasswordMask.vbs. Чтобы запустить сценарий, воспользуйтесь командой:

cscript.exe
SimplePasswordMask.vbs

Если вы будете использовать сценарий, приведенный в листинге 2 в рабочей среде, возможно, вы удалите строки, приведенные во фрагменте A. Другими словами теперь вы вооружены дополнительным средством управления.

WaitFor

Элемент управления WaitFor -это один из свободно-распространяемых компонентов, который можно загрузить с сайта компании ServerObjects (http://www.serverobjects.com/products.htm#free). WaitFor способен приостанавливать работу сценария на заданное количество секунд, сделать паузу, пока сценарий пытается найти файл, приостановить работу сценария на время, необходимое для определения того, имеет ли он доступ к заданному файлу. Хотя можно воспользоваться событиями Windows Management Instrumentation (WMI) или методом Sleep объекта WSH WScript для выполнения каждой из этих трех задач, использование WaitFor намного легче и удобнее.

После того, как вы загрузите WaitFor, необходимо, используя regsvr32.exe, зарегистрировать файл waitfor.dll. Например, если вы поместили DLL в папку C:waitfor, можно воспользоваться командой

C:windowssystem32
egsvr32.exe
C:waitforwaitfor.dll

Сценарий WaitForTester.vbs, показанный в листинге 3, демонстрирует, как использовать WaitFor. После того, как в сценарии объявляются переменные, он создает объект WaitFor Comp, который способен выполнить каждую из описанных трех задач.

В секции 1, метод WaitForSeconds объекта Comp приостанавливает выполнение сценария на 5 секунд. Этот метод воспринимает один параметр, величину, определяющую количество секунд для паузу. В демонстрационных целях, сценарий отображает время до и после паузы.

В секции 2, метод WaitForSeconds объекта Comp приостанавливает выполнение сценария на время, необходимое для поиска заданного файла. Можно заметить, что этот метод имеет два входных параметра: путь к имени файла и максимальное значение времени ожидания. Однако этот метод воспринимает в качестве параметра только имя файла. Чтобы задать для этого метода максимальную продолжительность паузы в сценарии, необходимо заранее установить требуемое число секунд задержки в свойстве TimeOut объекта Comp. В коде фрагмента A, представленном в листинге 3, вы должны установить значение свойства TimeOut перед вызовом метода WaitForFileExists. Если метод находит файл за отведенное время, он прекращает поиск файла и запускает сценарий для дальнейшей обработки и возвращает логическое значение TRUE. Если метод за отведенное время не найдет нужного файла, он возобновляет работу сценария и возвращает логическое значение FALSE. Сценарий передает эти логические значения оператору If...Then...Else, который отображает на экране соответствующее сообщение, основываясь на этих логических значениях.

В секции 3, метод WaitForExclusiveFileAccess объекта Comp приостанавливает работу сценария, пока тот определяет, имеются ли необходимые права доступа к заданному файлу. Подобно методу WaitForFileExists, метод WaitForExclusiveFileAccess воспринимает в качестве параметра только путь к файлу. Аналогично, снова задается свойство TimeOut, определяющее максимальное время приостановки работы сценария, как это представлено во фрагменте A в листинге 3. В нашем случае это время равно 15 секундам. Если вы захотите использовать то же время задержки, которое использовалось ранее методом WaitForFileExists (т.е. 10 секунд), вы не должны включать соответствующую строку во фрагмент А.

Метод WaitForExclusiveFileAccess возвращает логическое значение TRUE, когда права на доступ к файлу имеются, иначе, при отсутствии прав, возвращается значение FALSE. В зависимости от возвращенного значения, сценарий выводит на экран соответствующее сообщение.

Можно легко проверить работу методов WaitForFileExists и WaitForExclusiveFileAccess с помощью приведенного сценария WaitForTester.vbs. Для начала установите значения свойства TimeOut в секциях 2 и 3 равным большому числу, например 60. В секции 2 установите значение переменной strFilename равным C:scriptsfile1.txt. В секции 3 установите значение переменной strFilename равным C:scriptsfile2.doc.

Затем создайте файл file1.txt и разместите его в папке, отличной от указанной в коде сценария. Создайте файл file2.doc и оставьте его открытым. Теперь запустите WaitForTester.vbs. Запуск сценария из командной строки производится следующей командой:

cscript.exe WaitForTester.vbs

Пока сценарий ищет файл file1.txt в секции 2, скопируйте этот файл в папку C:scripts. Как только сценарий обнаружит этот файл, он осуществит переход к выполнению секции 3. Пока сценарий проверяет права доступа к файлу file2.doc, закройте в Word это файл. Сценарий обнаружит, что теперь он имеет доступ к этому файлу и оповестит об этом факте.

Полезные инструменты вашего инструментария

Лично для меня, управляющие компоненты DSOleFile, ScriptPW, и WaitFor оказались весьма полезными при составлении сценариев. Я уверен, что вам они тоже понравились.


Как проверить компоненты, используя Words Object Browser

Можно воспользоваться утилитами Microsoft Office для проверки функциональности компонентов Microsoft Word 2000 или более новых, например, выбрав Macros или Macro в зависимости от версии Word из меню Tools и затем выбрав Visual Basic Editor или Microsoft Script Editor. Если у вас отсутствует объект, на который можно указать, можно воспользоваться имеющимся меню для записи нового макроса. Остановите запись, затем войдите во вновь созданный макрос и отредактируйте его.

В окне Visual Basic Editor нажмите F2 или выберите Object Browser из меню View. Далее из меню Tools в Object Browser, выберите пункт Reference для открытия диалогового окна References. Добавьте ссылки для выбранного вами компонента. Например, на рисунке 1 показан образец пример диалогового окна, в которое добавлена ссылка на Windows Script Host Object Model.

После того, как вы добавили ссылку, выберите необходимый компонент из выпадающего списка в окне Object Browser. Например в Object Browser, показанном на рисунке 2, я выбрал объект IWshRuntimeLibrary, который является внутренним именем объектной модели Windows Script Host (WSH). Object Browser отображает объекты этого компонента в панели Classes. Также отображаются методы этого объекта, свойства и события в панели Members. Выбрав нужный метод, свойство или событие, в нижней части окна Object Browser отображается синтаксис использования выбранного объекта. Например, на рисунке 2 показано как для выбранного метода CreateTextFile объекта FileSystemObject отображается синтаксис метода в нижней панели.

Альтернативой использованию Visual Basic Editor является использование Microsoft Script Editor. После открытия Microsoft Script Editor нажите Ctrl+Alt+J, либо выберите Other Windows, затем Object Browser в меню View. Выберите пункт Customize и затем нужный компонент.

Если необходимо быстро открыть Object Browser, откройте одно из приложений Office, нажмите комбинацию Alt+F11 и дождитесь открытия окна, затем нажмите F2.


Листинг 1. DocPropTester.vbs
Dim strFile, objFilePropReader, objDocProp, strName,
Dim strAppName, strTitle, strAuthor, strComments, strWordCount
strFile = "C:scripts	est file.doc"
Set objFilePropReader = CreateObject("DSOleFile.PropertyReader")
Set objDocProp = objFilePropReader.GetDocumentProperties(strFile)
' BEGIN CALLOUT A
strName = objDocProp.Name
strAppName = objDocProp.AppName
strTitle = objDocProp.Title
strAuthor = objDocProp.Author
strComments = objDocProp.Comments
strWordCount = objDocProp.WordCount
' END CALLOUT A
objDocProp.CustomProperties.Add "TestProp",
 "Test Prop Value"
MsgBox strName & vbCrLf & strAppName &
 vbCrLf & _
	strTitle & vbCrLf & strAuthor &
 vbCrLf & strComments & _
	vbCrLf & strWordCount
For Each objCustProp In objDocProp.CustomProperties
	MsgBox objCustProp.Name & ": "
 & CStr(objCustProp.Value)
Next

Листинг 2. SimplePasswordMask.vbs
Dim objPassword, strPassword
Set objPassword = CreateObject("ScriptPW.Password")
WScript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()
' BEGIN CALLOUT A
WScript.Echo
WScript.Echo "Your password is: " & strPassword
' END CALLOUT A

Листинг 3. WaitForTester.vbs
Dim objWaitFor, strFilename
Set objWaitFor = CreateObject("WaitFor.Comp")
BEGIN COMMENT
' Section 1: Code that pauses the script the specified number
' of seconds.
'Секция 1: Код, приостанавливающий работу сценария на заданное число
' секунд.

END COMMENT
MsgBox "Beginning to wait at: " & Time
objWaitFor.WaitForSeconds 5
MsgBox "Finished waiting: " & Time
BEGIN COMMENT
' Section 2: Code that pauses the script during the search for
' the specified file.
'Секция 2: Код, приостанавливающий работу сценария на время поиска 
' заданного файла
END COMMENT
strFilename = "C:scripts	est.doc"
MsgBox "Beginning to wait at: " & Time
' BEGIN CALLOUT A
objWaitFor.TimeOut = 10
' END CALLOUT A
If objWaitFor.WaitForFileExists (strFileName) Then
	MsgBox "File found within TimeOut period"
Else
	MsgBox "File NOT found within TimeOut period"
End If
MsgBox "Finished waiting: " & Time
BEGIN COMMENT
' Section 3: Code that pauses the script while determining
' whether access is granted to the specified file.
'Секция 3: Код, приостанавливающий работу сценария на время
 'определения необходимых прав доступа к файлу
END COMMENT
strFilename = "C:scripts	est.doc"
MsgBox "Beginning to wait at: " & Time
MsgBox "Now waiting for exclusive file access " & strFilename
' BEGIN CALLOUT A
objWaitFor.TimeOut = 15
' END CALLOUT A
If objWaitFor.WaitForExclusiveFileAccess (strFileName) Then
	MsgBox "Exclusive file access granted with TimeOut period"
Else
	MsgBox "Exclusive file access NOT granted with TimeOut period"
End If
MsgBox "Finished waiting: " & Time