Rubyでwin32oleを使う。
RubyMagazineのCuzicさんの連載を読むべき。
win32ole意外に細かいところが重要だったリスるので、きっちり読むこと。
COMを使うの?VBAで良いじゃん?
違います。irbが使える。これがとんでもないアドバンテージなのじゃ。
使い方
Win32OLEを使う
準備する。
> require 'win32ole' >
これで準備完了です。
IEを起動してみる。
表示したり、消したりして遊んでみる。
> require 'win32ole' > ie = WIN32OLE.new 'InternetExplorer.Application' > ie.visible = true > ie.visible = false > ie.visible = true
IEが使えるメソッドを表示してみる。
> require 'win32ole' > ie = WIN32OLE.new 'InternetExplorer.Application' > ie.ole_methods => [QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke, GoBack, GoForward, GoHome, Go Search, Navigate, Refresh, Refresh2, Stop, Application, Parent, Container, Document, TopLevelContainer, Type, Left, Left , Top, Top, Width, Width, Height, Height, LocationName, LocationURL, Busy, Quit, ClientToWindow, PutProperty, GetPropert y, Name, HWND, FullName, Path, Visible, Visible, StatusBar, StatusBar, StatusText, StatusText, ToolBar, ToolBar, MenuBar , MenuBar, FullScreen, FullScreen, Navigate2, QueryStatusWB, ExecWB, ShowBrowserBar, ReadyState, Offline, Offline, Silen t, Silent, RegisterAsBrowser, RegisterAsBrowser, RegisterAsDropTarget, RegisterAsDropTarget, TheaterMode, TheaterMode, A ddressBar, AddressBar, Resizable, Resizable, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke] irb(main):008:0> ie.ole_methods
なんかいっぱいあるし、しかも順番めちゃくちゃだし。なんか見づらいよね。method名を**Stringにしてソートしてみた。
> require 'win32ole' > ie = WIN32OLE.new 'InternetExplorer.Application' > ie.ole_methods.map {|m| m.to_s}.sort => ["AddRef", "AddressBar", "AddressBar", "Application", "Busy", "ClientToWindow", "Container", "Document", "ExecWB", "F ullName", "FullScreen", "FullScreen", "GetIDsOfNames", "GetIDsOfNames", "GetProperty", "GetTypeInfo", "GetTypeInfo", "Ge tTypeInfoCount", "GetTypeInfoCount", "GoBack", "GoForward", "GoHome", "GoSearch", "HWND", "Height", "Height", "Invoke", "Invoke", "Left", "Left", "LocationName", "LocationURL", "MenuBar", "MenuBar", "Name", "Navigate", "Navigate2", "Offline ", "Offline", "Parent", "Path", "PutProperty", "QueryInterface", "QueryStatusWB", "Quit", "ReadyState", "Refresh", "Refr esh2", "RegisterAsBrowser", "RegisterAsBrowser", "RegisterAsDropTarget", "RegisterAsDropTarget", "Release", "Resizable", "Resizable", "ShowBrowserBar", "Silent", "Silent", "StatusBar", "StatusBar", "StatusText", "StatusText", "Stop", "Theat erMode", "TheaterMode", "ToolBar", "ToolBar", "Top", "Top", "TopLevelContainer", "Type", "Visible", "Visible", "Width", "Width"]
irbがあれば、MSDN使わなくて良い
irbでmethods一覧が出てくるので、MSDNの巨大ダンジョンを走り回らなくて良い。コレで、Windows(COM)プログラミングの速度が劇的に速くなると思う。僕はコレがないと、Windowsプログラミングやりたくないです。
IEを表示する。
irb(main):001:0> require 'win32ole' => true irb(main):002:0> ie = WIN32OLE.new 'InternetExplorer.Application' => #<WIN32OLE:0x4056f78> irb(main):004:0> ie.Visible = true #表示される => true irb(main):005:0> ie.Visible = false #消える。 => false
IEでサイト表示する。
IEでGoogleに行ってみる。
irb(main):001:0> require 'win32ole' => true irb(main):002:0> ie = WIN32OLE.new 'InternetExplorer.Application' => #<WIN32OLE:0x4256f08> irb(main):003:0> ie.Navigate2 "http://www.google.com/" => nil irb(main):004:0> ie.Visible = true => true irb(main):005:0>
さて、IEの内部のDOMにアクセスする。
ココかがら本題だよ。DOMにアクセスして、あれこれやってみよう。
irb(main):001:0> require 'win32ole' => true irb(main):004:0> ie = WIN32OLE.new 'InternetExplorer.Application' => #<WIN32OLE:0x4249e0c> irb(main):005:0> ie.Visible = true => true irb(main):006:0> ie.Navigate2 'http://www.google.com/' => nil irb(main):007:0> document = ie.Document #DOMオブジェクト => #<WIN32OLE:0x4233634> irb(main):008:0> window = ie.Document.ParentWindow => #<WIN32OLE:0x422caf0> irb(main):009:0> window.alert('Hello from Ruby win32') #Alertでた! => nil irb(main):010:0> document.forms.item(0).elements.item(2).value="this is ruby" #Formに値がでるよね。 => "this is ruby" irb(main):011:0> document.forms.item(0).submit #google検索結果。 => nil