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()
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()
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
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
Код тестовый - не для работы, понятное дело. Задача: загрузить EXCEL.EXE и попытаться его корректно выгрузить, не выходя из программы и не привлекая GC. Но не получается Процесс EXCEL.EXE в памяти остается на не определенное время, если не привлекать GC.Viper писал(а):Ндя... код весьма странен... Почто такие извращения? Цель всего этого какая?
''' <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
Спасибо.lord0n писал(а):я в свое время писал специальную процедуру для убийства ком объекта (не экселя, но тоже очень похож)
Public Overloads Sub Dispose()
KillApp() 'грохаем саперион (это предыдущая функция для убийства ком объекта)
App = Nothing 'чистим переменные
Doc = Nothing
MySap = Nothing
' Инициировать очистку.
' Здесь наши объекты только помечаются
' как «свободные», а память не
' освобождается.
GC.Collect()
' Подождать, пока отработают все
' деструкторы
GC.WaitForPendingFinalizers()
' Еще раз запустить очистку – теперь
' память под наши объекты будет реально
' освобождена.
GC.Collect()
MyBase.Finalize()
End Sub
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
MyClass.Dispose() не вызван, в смысле?Sebas писал(а):asharky
Так у Тебя класс не диспозится))))
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()
asn писал(а):Создаю объект Excel следующим образом:
ObjXlc = CreateObject("Excel.Application")
ObjXlc.Application.Workbooks.Open(Path)
Далее активирую нужную страницу,вставляю данные, сохраняю.
А вот убить процесс не получается. Пробовал
ObjXlc.close()
ObjXlc.quit()
ObjXlc=nothing
Excel продолжает висеть в процессах и умирает только когда закрываеш программу.
Что деляю не так?
asn писал(а):Создаю объект Excel следующим образом:
ObjXlc = CreateObject("Excel.Application")
ObjXlc.Application.Workbooks.Open(Path)
Далее активирую нужную страницу,вставляю данные, сохраняю.
А вот убить процесс не получается. Пробовал
ObjXlc.close()
ObjXlc.quit()
ObjXlc=nothing
Sebas писал(а):ShadowTFT
Уж сколько говорено, System.GC.Collect() нехорошо. Ибо делать надо 2 раза. + времени может уйти до... нескольких минут
With [object]
[statements]
end with
With Label1
.text = "Аргументов может быть несколько"
.width = 300
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
Сейчас этот форум просматривают: Google-бот и гости: 86