COMの仕組みを理解しようと Ruby の Win32OLE ドキュメント(win32ole: Ruby Standard Library Documentation)を追ってます。
前回の「COM を理解する(2):CでADODB.Connectionに接続する」にあるテーブルを表現した構造体に invoke がありますが、Ruby の invoke はそのへんを使っているっぽい。
$KCODE="s" require 'win32ole' sql = "SELECT * FROM earthquake;" connstr = "DRIVER={Microsoft Access Driver (*.mdb)};Dbq=D:\\lang\\Haskell\\sample1.mdb" cn = WIN32OLE.new("ADODB.Connection") cn.Open(connstr) rs = cn.Execute(sql) p rs.Fields.Count #=> 5 p rs.Fields(0).Name #=> "Name" p rs.Fields(1).Name #=> "Day" puts rs.Fields.Item("Name").Value #=> "関東大震災" cn.Close
invoke メソッドを使って書く。
require 'win32ole' sql = "SELECT * FROM earthquake;" connstr = "DRIVER={Microsoft Access Driver (*.mdb)};Dbq=D:\\lang\\Haskell\\sample1.mdb" cn = WIN32OLE.new("ADODB.Connection") # これも OK # cn = WIN32OLE.new("{00000514-0000-0010-8000-00AA006D2EA4}") # version p cn._getproperty(4, [], []) #=> "2.8" cn.invoke("Open", connstr) # ConnectionString p cn._getproperty(0, [], []) #=> "Provider=MSDASQL.1;Extended Properties=\"DBQ=D:\\lang\\Haskell\\sample1.mdb; Driver={Microsoft Access Driver (*.mdb)}; DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;\"" rs = cn.invoke("Execute", sql) p rs.invoke("Fields").invoke("Count") #=> 5 p rs.invoke("Fields",0).invoke("Name") #=> "Name" p rs.invoke("Fields",1).invoke("Name") #=> "Day" puts rs.invoke("Fields").invoke("Item","Name").invoke("Value") #=> "関東大震災" cn.invoke("Close")
WIN32OLE#_invoke(dispid, args, types) という dispid による更に C に近いプリミティブなメソッドもある。