logo
Программирование на языке Ruby

14.5.2. Расширение Win32ole

Расширение Win32OLE (правильно писать его имя строчными буквами: win32ole) реализует интерфейс к OLE-автоматизации в Windows. Программа на Ruby может выступать в роли клиента любого сервера автоматизации, к числу которых относятся, например, Microsoft Word, Outlook, Internet Explorer, а также многие продукты третьих фирм.

Для того чтобы начать взаимодействие с внешним приложением, мы создаем объект класса WIN32OLE. С его помощью мы получим доступ ко всем свойствам и методам, которые раскрывает данное приложение. В примере ниже объект ассоциируется с редактором Microsoft Word. Атрибуту visible мы присвоим значение true, а в конце вызовем метод quit, чтобы завершить внешнюю программу.

require "win32ole"

word = WIN32OLE.new "Word.Application"

word.visible = true

# ...

word.quit

Свойства сервера автоматизации выглядят как атрибуты объекта. Их можно читать и устанавливать.

Имеется и альтернативная нотация, в которой для доступа к свойствам используется конструкция, напоминающая хэш.

player["FileName"] = "file.wav"

name = player["FileName"]

# Эквивалентно следующим предложениям:

# player.FileName = "file.wav"

# name = player.FileName

У этой нотации есть то преимущество, что она позволяет проще осуществлять динамический доступ к свойствам, как показано в искусственном примере ниже:

puts "Введите имя свойства"

prop = gets

puts "Введите новое значение"

val = gets

old = obj[prop]

obj[prop] = val

puts "#{prop} было #{old}... стало #{obj[prop]}"

Но обратимся к более жизненным примерам. Следующий код получает от пользователя имя файла, передает его Microsoft Word и распечатывает файл:

require "win32ole"

print "Введите имя файла для распечатки: "

docfile = gets

word = WIN32OLE.new "Word.Application"

word.visible = true

word.documents.open docfile

word.options.printBackground = false

# Можно было бы также установить свойство printBackground в true,

# но тогда пришлось бы дожидаться, пока весь файл будет

# скопирован в буфер принтера, и только потом вызывать quit...

word.activeDocument.printout

word.quit

В следующем примере проигрывается WAV-файл. Недостаток заключается в том, что в конце программы мы поставили sleep на случайно выбранное время, а не просто дожидаемся, когда воспроизведение закончится. Предлагаем читателю устранить этот недочет в качестве упражнения.

require "win32ole"

sound = WIN32OLE.new("MCI.MMcontrol")

wav = "с:\\windows\\media\\tada.wav"

sound.fileName = wav

sound.autoEnable = true

sound.command = "Open"

sound.command = "Play"

sleep 7

В листинге 14.2 мы просим Internet Explorer открыть диалог для ввода текста.