我知道在直接使用VB时有人问过这个问题,但我在终止进程时遇到了问题。我使用的是jruby版本的win32ole和ruby1.9。我现在的代码是这样的:
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,它也应该打开一个现有的可执行文件,但每次我运行它时,它都会启动一个新的进程。一旦脚本停止,我就手动关闭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上挂起
发布于 2014-01-31 01:27:59
只是遇到了同样的问题,并找到了一个很好的解决方案,我想我应该在这里记录下来,供下次有人遇到这个问题时使用(因为如果你在JRuby代码中调用#exit,excel.Quit就不能工作)……
您可以在JRuby代码中使用以下一行程序来释放当前线程上分配的所有对象:
Java::OrgRacobCom::ComThread.Release您应该在完成所有WIN32OLE对象之后,在调用#exit之前使用这一行。
只有当您在JRuby代码中调用#exit时才需要这样做,因为正常的退出(通过到达代码的末尾)似乎确实释放了COM对象。
在阅读了雅各布/Racob中COM对象的生命周期之后,我想到了解决方案,这里有记录:JacobComLifetime
发布于 2013-06-24 23:40:27
尝试excel.Quit,它应该会关闭Excel。
https://stackoverflow.com/questions/17279325
复制相似问题