win32ole进程仍然在ruby中运行

时间:2013-06-24 15:32:23

标签: ruby excel jruby win32ole

我知道直接使用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正在运行。由于开始拯救它还应该打开一个现有的exe,但每次我运行它时,它都会启动一个新进程。一旦脚本停止我手动关闭excel但我也尝试使用excel.Close。我是否需要调用Marshal.releaseComObject的ruby等效项?我没有很多VB经验,我对ruby很新,所以如果这是一个愚蠢的问题,我很抱歉,但提前感谢!

编辑: 我也尝试过使用excel.quit和excel.Quit,对不起,我忘记提及了。似乎都没有工作。

编辑2: 我正在运行rubymine并使用windows xp,使用gem:jruby-win32ole

编辑3: 代码正确终止另一台计算机上的进程,因此可能是版本问题?在jruby 1.5.6上工作,进程挂起1.6.5.1

2 个答案:

答案 0 :(得分:3)

刚刚遇到同样的问题,并找到了一个简洁的解决方案,我认为我会在这里记录下次有人遇到这个问题(如果你在JRuby代码中调用#exit,则excel.Quit不起作用)。 ..

您可以在JRuby代码中使用以下单行代码来释放当前线程上分配的所有对象:

Java::OrgRacobCom::ComThread.Release

在完成所有WIN32OLE对象之后,以及在调用#exit之前,应该使用此行。

如果在JRuby代码中调用#exit,则只需执行此操作,因为正常退出(到达代码末尾)似乎确实释放了COM对象。

在阅读了Jacob / Racob中COM对象的生命周期之后,我找到了解决方案,如下所示:JacobComLifetime

答案 1 :(得分:0)

尝试excel.Quit,这应关闭Excel。