Как убить процесс Excel

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

asn
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 29.08.2005 (Пн) 8:18

Как убить процесс Excel

Сообщение asn » 16.10.2006 (Пн) 16:27

Создаю объект Excel следующим образом:
ObjXlc = CreateObject("Excel.Application")
ObjXlc.Application.Workbooks.Open(Path)

Далее активирую нужную страницу,вставляю данные, сохраняю.
А вот убить процесс не получается. Пробовал
ObjXlc.close()
ObjXlc.quit()
ObjXlc=nothing
Excel продолжает висеть в процессах и умирает только когда закрываеш программу.

Что деляю не так?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 16.10.2006 (Пн) 19:19

у меня пашет
Код: Выделить всё
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook

xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Add()
xlBook.Windows(1).Caption = "Tra-ta-ta"

'Make Excel visible
xlApp.Visible = True

Threading.Thread.Sleep(3000)
xlApp.Quit()
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asn
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 29.08.2005 (Пн) 8:18

Сообщение asn » 17.10.2006 (Вт) 9:32

Непрокатывает.
В процессах Excel все равно остается и уходит только после закрытия программы.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 17.10.2006 (Вт) 10:12

process.kill

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2006 (Вт) 10:13

xlApp.Quit(false)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

asn
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 29.08.2005 (Пн) 8:18

Сообщение asn » 17.10.2006 (Вт) 13:27

xlApp.Quit(false)

А это как?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2006 (Вт) 13:32

вместо xlApp.Quit()
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

asn
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 29.08.2005 (Пн) 8:18

Сообщение asn » 21.10.2006 (Сб) 11:23

xlApp.Quit(false)

Чего-то не получается, подчеркивает (False) как ошибку.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 21.10.2006 (Сб) 16:43

так прокатывает
Код: Выделить всё
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook

xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Add()
xlBook.Windows(1).Caption = "Tra-ta-ta"

'Make Excel visible
xlApp.Visible = True

Threading.Thread.Sleep(3000)
xlApp.Quit()

xlApp = Nothing
xlBook = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 23.10.2006 (Пн) 11:38

Совсем забыл, я когда-то то-же спрашивал, г-н Sebas послал меня в сторону System.Reflection. Помниться мне это помогло :!:

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 23.10.2006 (Пн) 14:10

Код: Выделить всё
        Dim e As Object = Nothing 'Excel.Application
        Dim b As Object = Nothing 'Excel.Workbook
        Dim s As Object = Nothing 'Excel.Worksheet

            e = CreateObject("Excel.Application") 'New Excel.Application
            b = e.Workbooks.Add
            s = b.Worksheets(1)

            b.Close()
            e.Quit()

        If s IsNot Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(s)
        End If
        If b IsNot Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(b)
        End If
        If e IsNot Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(e)
        End If
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

asn
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 29.08.2005 (Пн) 8:18

Сообщение asn » 31.10.2006 (Вт) 17:00

Спасибо всем, надавали советов просто кучу. Долгими усилиями вроде получилось.

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 05.10.2007 (Пт) 23:03

Какая-то ерунда у меня :(

Код: Выделить всё
Module MyModule

   Sub main()

      'Dim th As Threading.Thread
      'th = New Threading.Thread(AddressOf startExcel)
      'th.IsBackground = True
      'th.Start()
      'th.Join()
      'th = Nothing

      Dim cE As New sExcel

      cE.start()
      cE = Nothing
      Console.WriteLine("Останов")

      'GC.Collect()
      'GC.WaitForPendingFinalizers()
      'GC.Collect()

      Stop

   End Sub

   Sub startExcel()

      Dim e As Object = Nothing 'Excel.Application
      Dim b As Object = Nothing 'Excel.Workbook
      Dim s As Object = Nothing 'Excel.Worksheet

      e = CreateObject("Excel.Application") 'New Excel.Application
      b = e.Workbooks.Add
      s = b.Worksheets(1)

      b.Close()
      e.Quit()

      'If s IsNot Nothing Then
      '   System.Runtime.InteropServices.Marshal.ReleaseComObject(s)
      'End If
      'If b IsNot Nothing Then
      '   System.Runtime.InteropServices.Marshal.ReleaseComObject(b)
      'End If
      'If e IsNot Nothing Then
      '   System.Runtime.InteropServices.Marshal.ReleaseComObject(e)
      'End If

   End Sub

   Class sExcel

      Implements IDisposable

      Private e As Object = Nothing 'Excel.Application
      Private b As Object = Nothing 'Excel.Workbook
      Private s As Object = Nothing 'Excel.Worksheet

      '''<summary>Процедура уничтожения экземпляра класса</summary>
      Private Sub Dispose() Implements IDisposable.Dispose

         Me.Dispose()

         If s IsNot Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(s)
         End If
         If b IsNot Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(b)
         End If
         If e IsNot Nothing Then
            System.Runtime.InteropServices.Marshal.ReleaseComObject(e)
         End If

      End Sub   ' End Dispose()

      Sub start()

         e = CreateObject("Excel.Application") 'New Excel.Application
         b = e.Workbooks.Add
         s = b.Worksheets(1)

         b.Close()
         e.Quit()

      End Sub

   End Class

End Module


Всяко-разно пытался, и через поток в т.ч., но на Stop в Main(), если не использовать GC, процесс EXCEL.EXE всё ещё висит в памяти. Исчезает только после полного завершения программы. (Не компилил! В отладочном режиме!)

Что я сделал не так? Что не понимаю? Талмуды читал тут: http://www.microsoft.com/Rus/Msdn/publish/articles/MenuButton.mspx
В культурной столице проститутки берут книгами...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 06.10.2007 (Сб) 6:11

Ндя... код весьма странен... Почто такие извращения? Цель всего этого какая?
Весь мир матрица, а мы в нем потоки байтов!

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 06.10.2007 (Сб) 8:02

Viper писал(а):Ндя... код весьма странен... Почто такие извращения? Цель всего этого какая?
Код тестовый - не для работы, понятное дело. Задача: загрузить EXCEL.EXE и попытаться его корректно выгрузить, не выходя из программы и не привлекая GC. Но не получается :( Процесс EXCEL.EXE в памяти остается на не определенное время, если не привлекать GC.

На самом деле у меня несколько другая задача решается: прицепить вот это http://www.sls.ru/products/net/activesklad.html под .VB.NET. Но там ещё хуже всё. Разработчики вообще под .NET не работают и помочь ниче не могут. Ну а с EXCEL я вожусь чтобы разобраться с взаимодействием между .NET и COM.
В культурной столице проститутки берут книгами...

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 07.10.2007 (Вс) 10:17

я в свое время писал специальную процедуру для убийства ком объекта (не экселя, но тоже очень похож)
вот код:

Код: Выделить всё

   ''' <summary>
   ''' Ищет процесс Сапериона порожденный этой библиотекой и если находит, то убивает его
   ''' </summary>
   ''' <remarks></remarks>
   Private Sub KillApp()
      Dim Proc As Process() = Process.GetProcessesByName("ARCHIE32")
      Dim x As Integer
      If Not Proc Is Nothing Then
         For x = 0 To Proc.Length - 1
            If Proc(x).MainWindowTitle = "" Then 'в моем случае если заголовок окна был пустым, то процесс порождала моя программа
               Proc(x).Kill()
            End If
         Next
      End If
   End Sub
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 07.10.2007 (Вс) 10:31

lord0n писал(а):я в свое время писал специальную процедуру для убийства ком объекта (не экселя, но тоже очень похож)
Спасибо.

Но это просто кошмар какой-то получается :( Неужели средствами .NET вообще ничего поделать не возможно? :?

Но ведь при полном окончании программы GC как-то чистит всё помеченное? Как бы это сделать не выходя из программы? Ну в самом деле: не батники же писать в планировщике? :)

Эх Билли, Билли :roll:
В культурной столице проститутки берут книгами...

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 07.10.2007 (Вс) 11:10

Ну я так понимаю чтобы нормально завершался процесс нужно использовать не CreateObject, а ком интерапт или раннее связывание.
Я его правда не разу не использовал: очень уж длинные команды получаются по сравнению CreateObject

вот так принудительно вызвать сборщик мусора:
я вызываю его когда завершаю работу приложения, хотя говорят что принудительный вызов GC плохой тон.
Код: Выделить всё

   Public Overloads Sub Dispose()
      KillApp() 'грохаем саперион (это предыдущая функция для убийства ком объекта)

      App = Nothing 'чистим переменные
      Doc = Nothing
      MySap = Nothing
      ' Инициировать очистку.
      ' Здесь наши объекты только помечаются
      ' как «свободные», а память не
      ' освобождается.
      GC.Collect()
      ' Подождать, пока отработают все
      ' деструкторы
      GC.WaitForPendingFinalizers()
      ' Еще раз запустить очистку – теперь
      ' память под наши объекты будет реально
      ' освобождена.
      GC.Collect()
      MyBase.Finalize()
   End Sub
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 07.10.2007 (Вс) 11:29

lord0n писал(а):Ну я так понимаю чтобы нормально завершался процесс нужно использовать не CreateObject, а ком интерапт или раннее связывание. Я его правда не разу не использовал: очень уж длинные команды получаются по сравнению CreateObject


Всяко-разно пытался. Толку нет: пока программа не закроется, процесс висит в памяти.

lord0n писал(а):вот так принудительно вызвать сборщик мусора:
я вызываю его когда завершаю работу приложения, хотя говорят что принудительный вызов GC плохой тон.
Код: Выделить всё
   Public Overloads Sub Dispose()
      KillApp() 'грохаем саперион (это предыдущая функция для убийства ком объекта)

      App = Nothing 'чистим переменные
      Doc = Nothing
      MySap = Nothing
      ' Инициировать очистку.
      ' Здесь наши объекты только помечаются
      ' как «свободные», а память не
      ' освобождается.
      GC.Collect()
      ' Подождать, пока отработают все
      ' деструкторы
      GC.WaitForPendingFinalizers()
      ' Еще раз запустить очистку – теперь
      ' память под наши объекты будет реально
      ' освобождена.
      GC.Collect()
      MyBase.Finalize()
   End Sub


У меня в моём коде (выше) есть закоментированный:
Код: Выделить всё
                'If s IsNot Nothing Then
                '       System.Runtime.InteropServices.Marshal.ReleaseComObject(s)
                'End If
                'If b IsNot Nothing Then
                '       System.Runtime.InteropServices.Marshal.ReleaseComObject(b)
                'End If
                'If e IsNot Nothing Then
                '       System.Runtime.InteropServices.Marshal.ReleaseComObject(e)
                'End If
Из этого можно предположить, что я GC тоже пытался использовать. Нет результата всё равно.
В культурной столице проститутки берут книгами...

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 08.10.2007 (Пн) 15:52

а тебе так критично чтобы ексель убивался во время выполнения программы?
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 08.10.2007 (Пн) 16:17

asharky

Так у Тебя класс не диспозится))))
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.10.2007 (Пн) 17:23

They killed Excel! Bastards! :lol:
I don't understand. Sorry.

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 08.10.2007 (Пн) 17:42

Sebas писал(а):asharky

Так у Тебя класс не диспозится))))
MyClass.Dispose() не вызван, в смысле?

Вот переделал:

Код: Выделить всё
Module MyModule

Sub main()

   For i As Integer = 1 To 10

      Dim cE1 As New sExcel
      cE1.start()
      cE1 = Nothing

      Dim cE2 As New sExcel
      cE2.start()
      cE2 = Nothing

      Dim cE3 As New sExcel
      cE3.start()
      cE3 = Nothing

      Dim cE4 As New sExcel
      cE4.start()
      cE4 = Nothing

      Dim cE5 As New sExcel
      cE5.start()
      cE5 = Nothing


      Console.WriteLine("Цикл № " & i.ToString)

      GC.Collect()
      GC.WaitForPendingFinalizers()
      GC.Collect()

   Next

   Stop

End Sub

Sub startExcel()

   Dim e As Object = Nothing 'Excel.Application
   Dim b As Object = Nothing 'Excel.Workbook
   Dim s As Object = Nothing 'Excel.Worksheet

   e = CreateObject("Excel.Application") 'New Excel.Application
   b = e.Workbooks.Add
   s = b.Worksheets(1)

   b.Close()
   e.Quit()

End Sub

Class sExcel

   Implements IDisposable

   Private e As Object = Nothing 'Excel.Application
   Private b As Object = Nothing 'Excel.Workbook
   Private s As Object = Nothing 'Excel.Worksheet

   '''<summary>Процедура уничтожения экземпляра класса</summary>
   Private Sub Dispose() Implements IDisposable.Dispose

      If s IsNot Nothing Then
         System.Runtime.InteropServices.Marshal.ReleaseComObject(s)
      End If
      If b IsNot Nothing Then
         System.Runtime.InteropServices.Marshal.ReleaseComObject(b)
      End If
      If e IsNot Nothing Then
         System.Runtime.InteropServices.Marshal.ReleaseComObject(e)
      End If

      MyClass.Dispose()

   End Sub   ' End Dispose()

   Sub start()

      e = CreateObject("Excel.Application") 'New Excel.Application
      b = e.Workbooks.Add
      s = b.Worksheets(1)

      b.Close()
      e.Quit()

   End Sub

End Class

End Module


С закоментаренными:

Код: Выделить всё
   'GC.Collect()
   'GC.WaitForPendingFinalizers()
   'GC.Collect()


получается фигня :( Процессы EXCEL.EXE висят до закрытия программы. И даже пару раз вот такая вот картинка выскочила:
Вложения
Excel.jpg
Excel.jpg (77.36 Кб) Просмотров: 4559
В культурной столице проститутки берут книгами...

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 15.10.2007 (Пн) 20:03

Проблему решил. Она вообще не в той плоскости была у меня.
В культурной столице проститутки берут книгами...

ShadowTFT
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 07.03.2008 (Пт) 9:02

Re: Как убить процесс Excel

Сообщение ShadowTFT » 07.03.2008 (Пт) 9:14

asn писал(а):Создаю объект Excel следующим образом:
ObjXlc = CreateObject("Excel.Application")
ObjXlc.Application.Workbooks.Open(Path)

Далее активирую нужную страницу,вставляю данные, сохраняю.
А вот убить процесс не получается. Пробовал
ObjXlc.close()
ObjXlc.quit()
ObjXlc=nothing
Excel продолжает висеть в процессах и умирает только когда закрываеш программу.

Что деляю не так?


Молодой человек,объясняю ситуацию... Обращение к Excel у вас идет через Com Reference, их приимущество и недостаток состоит в том, что пока не будет нофинговона последняя ссылка на данный объект, объект не завершит своий процесс жизнедеятельности. Что делать?
В принципе ваше решение ObjXlc=nothing правильно НО!!!!!
В VB.Net очистка занятие для GC (сборщика мусора). Запуск его происходит произвольно. НО!!!! Мы можем запустить его руками, его так и зовут GC нах-ся он в пространстве имен System и его метод очистки зовут Collect()... значит дописываем в ваш проэкт


asn писал(а):Создаю объект Excel следующим образом:
ObjXlc = CreateObject("Excel.Application")
ObjXlc.Application.Workbooks.Open(Path)

Далее активирую нужную страницу,вставляю данные, сохраняю.
А вот убить процесс не получается. Пробовал
ObjXlc.close()
ObjXlc.quit()
ObjXlc=nothing


добавляем
System.GC.Collect()

нажимаем три ласковых кнопки и смотрим результат))
вот и всё.

Приятного вам времяпрепровождения.
ShadowTFT

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 10.03.2008 (Пн) 15:27

ShadowTFT

Уж сколько говорено, System.GC.Collect() нехорошо. Ибо делать надо 2 раза. + времени может уйти до... нескольких минут
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

ShadowTFT
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 07.03.2008 (Пт) 9:02

Сообщение ShadowTFT » 07.04.2008 (Пн) 14:15

Sebas писал(а):ShadowTFT

Уж сколько говорено, System.GC.Collect() нехорошо. Ибо делать надо 2 раза. + времени может уйти до... нескольких минут


Ну да ладно GC быстро работает, просто её не надо ждать, её надо вызвать в ручную Collect и будет вам счастье..
Ок, не хотите пользовать GC по пользуйте кострукцию With!

Код: Выделить всё
With [object]
[statements]
end with


поясняю на примере

Код: Выделить всё
With Label1
         .text = "Аргументов может быть несколько"
         .width = 300
end with


И после этого Самого "end with" все ссылки на объект сами чистятся, если мне не изменяет пампять...

В вашем случае, конструкция будет чуть сложнее:

Код: Выделить всё
With ExcelApplication.workbook(путь).Sheet(идекс листа)
     for y = 1 to 10
          for x = 1 to 100         
              str(x,y)= .cells(x,y).value
          next
     next
end with


что-то вроде того.. 8)

ShadowTFT
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 07.03.2008 (Пт) 9:02

Сообщение ShadowTFT » 07.04.2008 (Пн) 14:25

Да и вообще, если по хорошему, можно просто создать ещё поток(Благо в net'е есть BackgroundWorker) и положить всё в этот поток. Как только поток закончит своё грязное дело, он закроется и все ссылки не просто Nothing'нуться, а канут в никуда.. Просто с Com компонентами всегда тяжко, не спорю, комфорт, но вот только процессы остаются весеть и Com объекты, а конкретнее Excel точно, очень медленно работаю. Я в своё время просто написал себе класс с DataTabl'ами, и читал Excel без Com'а.. Но вот к сожалению, он куда-то пропал...((


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList