Excelを終了させる方法

rubyからOLE経由でExcelを操作するのはこちらを参考に
http://magazine.rubyist.net/?0004-Win32OLE

問題はQuitしてもExcelのプロセスが残ってしまうこと。irbで実行すればわかるけど

require 'win32ole'

xl = WIN32OLE.new('Excel.Application')
book = xl.Workbooks.Open("c:/a.xls")
book.Close(false)
xl.Quit
sleep(10)

で、タスクマネージャでプロセス一覧を見てみるとEXCEL.EXEが残っていることがわかる。
rubyが終了すればEXCEL.EXEが消えるので、おそらくGCされる際にCOMのIUnknown::releaseが呼ばれるのだろう。

ま、通常はこれでも問題無いのだがずっと稼働させるアプリの場合はちゃんとExcelが終了するようにしてあげましょう

require 'win32ole'

excel = WIN32OLE.new('Excel.Application')
books = excel.Workbooks
workbook = books.Open('C:/a.xls')
books.ole_free
workbook.Close(:SaveChanges => false)
workbook.ole_free
excel.ole_free
sleep(10)

でも、全部のCOMオブジェクトでole_freeしないといけないので、超面倒だなぁ