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

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

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 = "с:windowsmediatada.wav"
sound.fileName = wav
sound.autoEnable = true
sound.command = "Open"
sound.command = "Play"
sleep 7

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

Листинг 14.2. Открытие диалога для ввода текста в браузере

require "win32ole"
def ieInputBox( msg, default )
 ie = WIN32OLE.new("InternetExplorer.Application");
 ie.visible = false
 ie.navigate "about:blank"
 sleep 0.01 while (ie.busy)
 script = ie.Document.Script;
 result = script.prompt(msg,default);
 ie.quit
 result
end
# Главная программа...
result = ieInputBox( "Введите свое имя",
 "Дэйв Боумэн")
if result
 puts result
else
 puts "Пользователь нажал Cancel"
end

В листинге 14.3 мы открываем IE в небольшом окне и выводим в него HTML-документ.

Листинг 14.3. Для вывода в окно браузера требуется win32ole

html = <<EOF
<html>
 <body>
  <h3>A теперь что-нибудь</h3>
  <h2>совсем</h2>
  <h1>другое...</h1>
 </body>
</html>
EOF
ie = WIN32OLE.new("InternetExplorer.Application");
ie.left = 150
ie.top = 150
ie.height = 200
ie.width = 300
ie.menubar = 0
ie.toolbar = 0
ie.navigate "about:blank"
ie.visible=TRUE;
ie.document.open
ie.document.write html
ie.document.close
sleep 5
ie.quit

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

require "win32ole"
cd = WIN32OLE.new("MSComDlg.CommonDialog")
# Задать фильтр файлов
cd.filter = "All Files(*.*)| *.*" +
 "| Ruby Files(*.rb)|*.rb"
cd.filterIndex = 2
cd.maxFileSize = 128 # Установить MaxFileSize.
cd.showOpen()
file = cd.fileName   # Получить путь к файлу.
if not file or file==""
 puts "Файл не выбран."
else
 puts "Пользователь выбрал: #{file}n"
end

И, наконец, определим IP-адрес своего компьютера:

require "win32ole"
ws = WIN32OLE.new "MSWinsock.Winsock"
# Получить свойство LocalIP
ipAddress = ws.localIP
puts "Локальный IP-адрес равен : #{ipAddress}"

Как видите, возможности не ограничены. Развлекайтесь и не забывайте делиться своими программами с другими!

Оглавление книги


Генерация: 1.217. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз