win32ole进程仍在ruby中运行

我知道这个问题已经被直接使用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,得到一个值并终止。 但是当我查看任务pipe理器时,我仍然看到EXCEL.exe正在运行。 由于开始救援,它也应该打开一个现有的EXE,但每次运行它,它启动一个新的过程。 一旦脚本停止手动closuresExcel,但我也尝试使用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上

刚刚遇到同样的问题,并发现一个整洁的解决scheme,我想我会在下次有人遇到这个问题时logging在案(如excel.Quit不工作,如果您在JRuby代码中调用#exit)…

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

 Java::OrgRacobCom::ComThread.Release 

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

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

在阅读Jacob / Racob的COM对象的生命周期之后,我find了这个解决scheme: JacobComLifetime

尝试excel.Quit ,这应该closuresExcel。