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 = "с:\windows\media\tada.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} "
end
И, наконец, определим IP-адрес своего компьютера:
require "win32ole"
ws = WIN32OLE.new "MSWinsock.Winsock"
# Получить свойство LocalIP
ipAddress = ws.localIP
puts "Локальный IP-адрес равен : #{ipAddress}"
Как видите, возможности не ограничены. Развлекайтесь и не забывайте делиться своими программами с другими!
Данный текст является ознакомительным фрагментом.