【问题标题】:win32ole process still running in rubywin32ole 进程仍在 ruby​​ 中运行
【发布时间】:2013-06-21 04:29:25
【问题描述】:

我知道直接使用 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

【问题讨论】:

    标签: ruby excel jruby win32ole


    【解决方案1】:

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

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

    Java::OrgRacobCom::ComThread.Release
    

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢输入,但仍然没有终止程序
      • 在任务栏中还能看到程序,还是在任务管理器中看到进程?
      • 任务管理器中的进程。当我多次运行脚本时,我得到了一个新进程,我最终不得不从任务管理器中手动结束多个进程。很抱歉造成混乱,意味着进程不是程序
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      相关资源
      最近更新 更多