2013-06-24 68 views
3

我知道這個問題已被問到直接使用VB時,但我有麻煩終止一個進程。我使用的是win32ole和ruby 1.9的jruby版本。我當前的代碼是這樣的:win32ole過程仍然在ruby中運行

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正在運行。由於開始營救,它也應該打開一個現有的exe,但每次運行它時,它都會啓動一個新的過程。一旦腳本停止手動關閉excel,但我也嘗試使用excel.Close。我是否需要調用Marshal.releaseComObject的ruby等價物?我沒有很多VB的經驗,而且我對Ruby很新,所以如果這是一個愚蠢的問題,我很抱歉,但是請提前致謝!

編輯: 我也嘗試過使用excel.quit和excel.Quit,對不起,我忘了提到這一點。似乎都沒有工作。

編輯2: 我在RubyMine的運行和使用Windows XP,使用寶石:JRuby的WIN32OLE

編輯3: 代碼正確另一臺計算機上終止進程,所以可能是有問題的版本?在jruby 1.5.6上工作,進程掛在1.6.5.1上

回答

0

嘗試excel.Quit,它應該關閉Excel。

+0

感謝輸入,但它仍然沒有終止程序 – janDro

+0

你仍然可以看到任務欄中的程序,或者您可以在任務管理器中看到該過程? – Daiku

+0

任務管理器中的進程。當我多次運行這個腳本時,我得到一個新的進程,最後我必須從任務管理器手動結束多個進程。對於混淆抱歉,意味着過程而非程序 – janDro

3

剛剛遇到同樣的問題,並發現一個整潔的解決方案,我認爲我會在下次有人遇到此問題時記錄在案(如excel.Quit不起作用,如果您在JRuby代碼中調用#exit) ...

您可以使用下面的一行代碼將在JRuby代碼來釋放當前線程分配的所有對象:

Java::OrgRacobCom::ComThread.Release 

您與所有WIN32OLE對象完成後,你應該使用這條線,然後再調用#exit。

如果您在JRuby代碼中調用#exit,則只需執行此操作,因爲正常退出(通過到達代碼的末尾)似乎釋放COM對象。

解決方案來找我讀到雅各/ Racob COM對象的生命週期之後,如記錄在這裏:JacobComLifetime

相關問題