4

VB を直接使用しているときにこの質問が出されたことは知っていますが、プロセスを終了するのに問題があります。win32ole と ruby​​ 1.9 の jruby バージョンを使用しています。私の現在のコードは次のようなものです:

begin
 excel = WIN32OLE::connect('excel.Application')
rescue
 excel = WIN32OLE::new('excel.Application')
end
excel.Visible = 1
workbook = excel.Workbooks.Open("path to some doc")
ws = workbook.Worksheets(1)
ws.Select
cell_content = ws.Cells(4,4).Value
puts("#{cell_content}")
workbook.Close
cell_content = nil
ws = nil
workbook = nil
excel.ole_free
excel = nil
GC.start

私は単純にExcelを開いて、値を取得して終了しようとしています。しかし、タスク マネージャーを調べると、まだ EXCEL.exe が実行されていることがわかります。begin-rescue により、既存の exe も開く必要がありますが、実行するたびに新しいプロセスが開始されます。スクリプトが停止したら、手動で Excel を閉じますが、excel.Close も使用してみました。Marshal.releaseComObject に相当する Ruby を呼び出す必要がありますか? 私は VB の経験があまりなく、Ruby にかなり慣れていないので、これがばかげた質問である場合は申し訳ありませんが、事前に感謝します!

編集: 私はまた、excel.quit と excel.Quit を使用してみました。申し訳ありませんが、それについて言及するのを忘れていました。どちらも機能していないようです。

編集 2: ruby​​mine で実行し、Windows XP を使用して、gem: jruby-win32ole を使用しています。

編集 3: コードは別のコンピューターでプロセスを適切に終了させるため、バージョンに問題がある可能性がありますか? jruby 1.5.6 で作業し、1.6.5.1 でプロセスがハングする

4

2 に答える 2

3

同じ問題に遭遇しただけで、次回誰かがこの問題に遭遇したときに備えてここに文書化しておくべきだと思ったきちんとした解決策を見つけました (JRuby コードで #exit を呼び出している場合、excel.Quit は機能しません)...

JRuby コードで次のワンライナーを使用して、現在のスレッドに割り当てられているすべてのオブジェクトを解放できます。

Java::OrgRacobCom::ComThread.Release

この行は、すべての WIN32OLE オブジェクトの処理が終了した後、#exit を呼び出す前に使用する必要があります。

JRuby コードで #exit を呼び出す場合にのみ、これを行う必要があります。これは、(コードの最後に到達することによる) 通常の終了では COM オブジェクトが解放されるように見えるためです。

ここに文書化されているように、Jacob/Racob の COM オブジェクトのライフサイクルについて読んだ後、解決策が思い浮かびました: JacobComLifetime

于 2014-01-30T17:27:59.090 に答える