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 正在运行。由于开始救援,它还应该打开一个现有的 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

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

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

Java::OrgRacobCom::ComThread.Release

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

只有在 JRuby 代码中调用 #exit 时才需要这样做,因为正常退出(通过到达代码末尾)似乎确实释放了 COM 对象。

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

于 2014-01-30T17:27:59.090 回答
0

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

于 2013-06-24T15:40:26.747 回答