Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > win32oleライブラリ > WIN32OLEクラス > ole_free

instance method WIN32OLE#ole_free

ole_free -> ()[permalink][rdoc]

selfが参照するCOMオブジェクトを解放します。

selfが参照するCOMオブジェクトのIUnknown::Releaseを呼び出すことで、COMオ ブジェクトを開放します。ole_freeを呼び出した後は、このオブジェクトに対 する操作は行えません。

excel = WIN32OLE.new('Excel.Application')
excel.ole_free  # オブジェクトの解放
excel.Quit      #=> RuntimeError (failed to get Dispatch Interface)

通常は利用されなくなったWIN32OLEオブジェクトはGCのタイミングで自動的に 解放されるため、当メソッドを呼び出す必要はありません。Officeのような外 部プロセスサーバ呼び出し時に、スクリプト終了後もサーバが解放されない場 合に強制的にサーバを終了するために当メソッドを利用できます。ただし、現 実には途中で生成される子オブジェクトからの逆参照などがあるため、 WIN32OLEがIUnknown::Releaseを呼び出してもオブジェクトが解放されるとは限 りません。

excel = WIN32OLE.new('Excel.Application')
workbook = excel.Workbooks.Open('workbook.xls')
workbook.Close(:SaveChanges => false)
workbook.ole_free
excel.ole_free
# この時点でExcel.EXEは終了しない

上の例では、excel.Workbooks.Openの行で、excel.Workbooksオブジェクトが生 成されています。しかし、後続の処理で該当オブジェクトが解放されていない ため、Workbooksオブジェクトによって参照されているexcelオブジェクトは解 放されません。それに対して下の例では正しく解放されます。

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