В данном случае функция вернула составные двоичные данные, а иногда такие данные нужно подать на вход функции. Понятно, что для этого нужно воспользоваться методом
pack
, который упакует данные в строку.
У описанной техники может быть много применений. Еще два примера
приведены в разделах 10.1.20 и 14.1.1.
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. Открытие диалога для ввода текста в браузере