Процесс win32ole все еще работает в ruby

Я знаю, что этот вопрос задавался при непосредственном использовании VB, но у меня возникли проблемы с завершением процесса. Я использую jruby-версию win32ole и ruby ​​1.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 работает. Из-за начала спасения он также должен открывать существующий исполняемый файл, но каждый раз, когда я его запускаю, он запускает новый процесс. Как только скрипт останавливается, я вручную закрываю excel, но я также пытался использовать excel.Close. Нужно ли вызывать рубиновый эквивалент Marshal.releaseComObject? У меня нет большого опыта работы с VB, и я новичок в рубине, поэтому извините, если это глупый вопрос, но заранее спасибо!

Изменить: я также пытался использовать excel.quit и excel.Quit, извините, я забыл упомянуть об этом. Ни один из них не работает.

Редактировать 2: я работаю на rubymine и использую Windows XP, используя gem: jruby-win32ole

Редактировать 3: Код правильно завершает процесс на другом компьютере, так что, возможно, проблема с версиями? На jruby 1.5.6 работало, на 1.6.5.1 процесс зависает


person janDro    schedule 24.06.2013    source источник


Ответы (2)


Просто столкнулся с той же проблемой и нашел изящное решение, которое, как я думал, я задокументирую здесь в следующий раз, когда кто-то столкнется с этой проблемой (поскольку excel.Quit не работает, если вы вызываете #exit в своем коде JRuby)...

Вы можете использовать следующий однострочный код в своем коде JRuby, чтобы освободить все объекты, размещенные в текущем потоке:

Java::OrgRacobCom::ComThread.Release

Вы должны использовать эту строку после того, как закончите со всеми вашими объектами WIN32OLE, и до того, как вы вызовете #exit.

Вам нужно делать это только в том случае, если вы вызываете #exit в своем коде JRuby, поскольку обычный выход (путем достижения конца вашего кода), похоже, освобождает COM-объекты.

Решение пришло ко мне после прочтения о жизненном цикле COM-объектов в Jacob/Racob, как описано здесь: JacobComLifetime

person Adam    schedule 30.01.2014

Попробуйте excel.Quit, что должно закрыть Excel.

person Daiku    schedule 24.06.2013
comment
спасибо за ввод, но это все еще не завершает работу программы - person janDro; 24.06.2013
comment
Вы все еще можете видеть программу в панели задач, или вы можете видеть процесс в диспетчере задач? - person Daiku; 24.06.2013
comment
Процесс в диспетчере задач. Когда я запускаю скрипт несколько раз, я получаю новый процесс, и мне приходится вручную завершать несколько процессов из диспетчера задач. Извините за путаницу, имелся в виду процесс, а не программа - person janDro; 24.06.2013