著作一覧 |
1.9でのクロススレッディングイシューだが、IGlobalInterfaceTable使えば簡単だなぁと思ってパッチを作ってみた(結構でかい。IGlobalInterfaceTable無しの環境を半分だけサポートしているので中途半端(RELEASE時にもチェックが必要)なのは、以下の理由から仕上げに入っていないからだ)が、最後にオブジェクトをリリースできない。
Revokeを呼び出さない限りどうにもならないからだ。とは言え、いちいちole_freeの呼び出しが必要というのもよろしくはない。
結局、あのてのクリーンアップが必要なオブジェクトを操作するAPIは、RAIIにしておけということだなぁ。
たとえば
WIN32OLE.create(progid) do |obj| obj.foobar end # <- Releaseが勝手に呼ばれる
となっていたら、簡単だったね。
で、それ以外の利用方法なら、明示的にfreeを呼び出すことに決める。ちょうど、IOにブロックを渡すか、さもなければcloseを呼ばせるか、と同じことだ。
テストプログラム
# coding: cp932 require 'win32ole' c = WIN32OLE.new('Excel.Application') Thread.start do c.visible = true sleep 5 end.join c.quit # c.ole_free 有効にすればOK。無効なままだとEXCELが居残る。
ジェズイットを見習え |