WordBasic та макровіруси, Visual Basic, Статті, Програмування - Програмування C, Delphi, C#

Моє знайомство з Microsoft Word почалося півтора роки тому, коли мені вперше знадобилося оформити великий текстовий документ - дипломну роботу. Тепер я насилу можу уявити своє робоче місце без звичної іконки.

У Word можна багато робити: набирати і редагувати текст, малювати нескладні картинки, навіть верстати книжки. Існує чимало книг, присвячених роботі з Word, проте в них слабо або зовсім не торкнуться мови макрокоманд – WordBasic.

Тим часом WordBasic – зручна та проста мова програмування, що дозволяє автоматизувати рутинну роботу з тестовими документами, керувати будь-якими Windows-програмами і навіть написати вірус.

У наведених прикладах я постаралася продемонструвати найкорисніші можливості WordBasic та показати можливості мови.

1. Загальні зауваження.

Найпростіше створити макрос за допомогою команди Сервіс->Макрос->Почати запис. Всі дії користувача до натискання кнопки Стоп записуються в макрос і відтворюються під час запуску цього макросу. Такий спосіб не дозволяє організовувати цикли та видавати повідомлення користувачеві, тому для написання повноцінної програми необхідно відредагувати записаний макрос. Для цього в Word 6.0 та 7.0 необхідно вибрати команду Сервіс ->Макрос-> Змінити. (Сервіс->Макрос->Редактор VisualBasic в Word97).

Повний опис команд WordBasic поставляється з Word, але не встановлюється за замовчуванням. Якщо Ви не можете знайти цей розділ у Вашій довідковій системі, то необхідно встановити його з дистрибутивного диска Word.

У будь-якому довіднику з програмування написано, що хороша програма має бути інтерактивною, тобто має вміти вести діалог із користувачем. Розглянемо,Як це можна зробити за допомогою WordBasic.

Напишемо дуже коротеньку програму, що видає на екран повідомлення.

Перший параметр функції MsgBox задає текст повідомлення, другий тип повідомлення, тобто. значок і кнопки, а третій задає заголовок вікна повідомлення.

Тепер спробуємо ускладнити програму. Нехай вона виводить на екран повідомлення з написом "Закрити Word?" та кнопками "Ok" та "cancel". Крім того, нехай програма закриває Word за натисканням Ok.

Тут ми використовуємо повернене функцією MsgBox значення для того, щоб визначити яку кнопку натиснув користувач.

Якщо функція повернула vbOK, тобто. Користувач вибрав кнопку OK, ми викликаємо метод Quit об'єкта Application (об'єктом Application є сам Word).

Але це ще не все. При виході Word видає попередження, якщо зміни у файлах не збережено. Модифікуємо програму так, щоб ці повідомлення не відображалися. Для цього встановимо властивість DisplayAlerts об'єкта Application, що управляє виведенням повідомлень на екран у false і вкажемо параметр wdDoNotSaveChanges (не зберігати зміни) для методу Application.Quit

Макрос готовий. Бажаєте здивувати колегу? Перепишіть цей макрос у шаблон Normal.dot під назвою Autoexec (макроси з такою назвою виконуються автоматично при запуску Word).

3. Як розпланувати перекури.

Припустимо, що співробітники Вашого відділу занадто часто курять, або, навпаки, так захоплюються роботою, що забувають пообідати (це звичайно малоймовірний випадок).

Друга програма, яку ми напишемо, нагадуватиме, що вже можна сходити покурити, або, скажімо, пообідати. Метод OnTime об'єкта application дозволяє встановити час виконання макросу. Синтаксис цього методу наступний:

Тут When вказує час виконання,Name – це ім'я макросу, який необхідно виконати, Tolerance – необов'язковий параметр, що вказує на проміжок часу, протягом якого має виконатися макрос.

У нашій програмі повідомлення видаватимуться щогодини. Назвемо перший макрос AutoExec, щоб він запускався під час старту Word. У нашому випадку метод onTime використовує функції Now, щоб визначити поточний час, і TimeValue для того, щоб задати проміжок рівний годині. Макрос Message видає повідомлення та задає наступний інтервал виконання.

Злегка видозмінивши макрос, можна написати цілий розклад на робочий день. Єдине, що слід пам'ятати - такі макроси найкраще зберігати в глобальному шаблоні Normal.dot, щоб вони були завжди доступні.

Можливо, у Вашому офісі теж є бухгалтер, який досі вважає за краще працювати під Dos. Час від часу Вам потрібно працювати з його текстовими файлами. Часто в таких випадках відкритий файл займає лише частину сторінки і виглядає так:

  1. Замінити два поспіль символи кінця абзацу на символ табуляції.
  2. Замінити символи кінця абзацу на пробіли.
  3. Замінити символи табуляції на символи кінця абзацу.

Досить стомно щоразу проводити такі заміни вручну, тому напишемо макрос, який це робитиме за нас.

Взагалі, для виконання будь-яких однотипних дій краще створити макрос. Практика показує, що витрачене на цей час з лишком окупається надалі. До того ж Ви позбавляєтеся маси рутинної роботи.

5. Як прочитати зіпсований лист

Ідея дуже проста. У двох рядкових змінних WinCodePage і KoiCodePage задаємо кодові таблиці Windows і Koi, потім будемо замінювати i-ту літеру з рядка WinCodePage на i-ту літеруРядки KoiCodePage. При цьому відзначатимемо курсивом вже замінені букви, щоб не замінити одну й ту саму букву двічі.

Для зворотного кодування необхідно лише замінити місцями імена MySearch і MyReplace.

6. Як захиститися від макровірусів

Макровіруси зазвичай пишуть школярі з метою самоствердження. Такі віруси не роблять нічого поганого – вони лише розмножуються на Вашому комп'ютері. Однак не слід нехтувати засобами захисту від макровірусів, оскільки за допомогою WordBasic можна написати вірус, що псує документи Word, або навіть форматуючий жорсткий диск. Особливість макровірусів у тому, що звичайні антивіруси їх розпізнають. Для захисту від макровірусів можна порадити ViruScan компанії MacCafee. (http://www.macafee.com). Крім того, існує кілька простих способів запобігти зараженню.

У Word 6.0 всі макроси зберігаються у файлах шаблонів (*.dot) і доступні лише за відкритого шаблону. Оскільки під час відкриття Word автоматично завантажує глобальний шаблон Normal.dot, всі віруси прагнуть записати себе туди. Тому, якщо ви працюєте в Word 6.0, вкажіть для файлу Normal.dot атрибут "тільки читання".

Ще один варіант - під час відкриття підозрілих документів тримати натиснутою клавішу shift, щоб не допустити виконання автомакросів. Ну і зрозуміло, якщо Ви виявите у списку макросів імена, що починаються на auto - зітріть їх негайно.

У Word97 макроси можуть міститися у шаблонах, а й у звичайних документах. Як уже згадувалося, для автоматичного запуску макросу при тій чи іншій події макрос повинен мати одне з таких імен:

  • AutoExec - Запускається під час старту Word або завантаження глобального шаблону
  • AutoNew - Запускається під час створення нового документа
  • AutoOpen -Запускається при відкритті документа
  • AutoClose - Запускається при закритті документа
  • AutoExit - Запускається під час виходу з Word або закриття глобального шаблону.

Звичайно можна скасувати виконання таких макросів, натиснувши клавішу Shift при завантаженні Word, а також при відкритті, створенні та закритті документів, проте мені такий спосіб видається втомливим. Напишемо макрос, що перешкоджає виконанню автомакросу:

Для запобігання зараженню документів макровірусами необхідно добре уявляти собі їх принцип роботи. Автори Microsoft Office полегшили завдання зловмисників тим, що ввели можливість замінювати команди Word макрокомандами користувача. Це означає, що якщо у Вашому документі є макрос з ім'ям, скажімо, FileOpen, він буде виконуватися щоразу при відкритті іншого документа.

Особливо вразливі користувачі Word 97. У старих добрих версіях Word макроси могли зберігатися лише шаблонах (файлах *.dot). Office'97 дозволяє зберігати макроси безпосередньо в документі – отже, можливостей поширення вірусів стає більше.

Розглянемо вірус, який призначений для зараження Word-документів. Цей вірус використовує ім'я FileOpen. Процедура FileOpen() виконується щоразу, коли користувач відкриває файл і маскується під звичайний діалог Файл-відкрити файл.

Як бачите, цей вірус не використовує імена автомакросів, і написаний вище макрос autoexec() від нього не врятує:)

Правду кажучи, мені не відомий спосіб захисту від таких вірусів. Єдине, що можна порекомендувати: переглядайте підозрілі файли і стирайте виявлені макроси з іменами типу FileOpen, FileNew, FileSave або FileSaveAs.

7. Як керувати будь-якою Windows-програмою

Спочатку запустимо Netscape Navigator командою Shell ("C:\netscape\program\netscape.exe", vbNormalFocus). Перший параметр команди вказує шлях до програми, другий визначає вигляд вікна програми.

Використовуємо SendKeys для імітації введення з клавіатури в активне вікно Windows.

Отже, для управління будь-яким Windows-програмою необхідно просто запустити програму, зробити її вікно активним і за допомогою команди SendKeys "ввести з клавіатури" все, що необхідно. Погодьтеся, це набагато простіше, ніж боротися із повідомленнями Windows.

Насамкінець я хочу перерахувати випадки, коли на мій погляд, зручніше користуватися макросами Word, а не іншими засобами програмування:

  • При обробці документів Word, оскільки формат документів Word досі є таємницею, що ретельно приховується компанією Microsoft.
  • При обробці текстових документів, особливо пов'язаних з пошуком та заміною. Word надає Вам безліч зручних функцій для роботи з текстом.

Примітка:Всі наведені приклади написані на версії WordBasic для Office'97.