首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仍在ruby中运行的win32ole进程

仍在ruby中运行的win32ole进程
EN

Stack Overflow用户
提问于 2013-06-24 23:32:23
回答 2查看 930关注 0票数 4

我知道在直接使用VB时有人问过这个问题,但我在终止进程时遇到了问题。我使用的是jruby版本的win32ole和ruby1.9。我现在的代码是这样的:

代码语言:javascript
复制
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上挂起

EN

回答 2

Stack Overflow用户

发布于 2014-01-31 01:27:59

只是遇到了同样的问题,并找到了一个很好的解决方案,我想我应该在这里记录下来,供下次有人遇到这个问题时使用(因为如果你在JRuby代码中调用#exit,excel.Quit就不能工作)……

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

代码语言:javascript
复制
Java::OrgRacobCom::ComThread.Release

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

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

在阅读了雅各布/Racob中COM对象的生命周期之后,我想到了解决方案,这里有记录:JacobComLifetime

票数 3
EN

Stack Overflow用户

发布于 2013-06-24 23:40:27

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17279325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档