Dim AppExl as Object
Dim wrBook as Object
Set AppExl = CreateObject("Excel.Application")
Set wrBook = AppExl.Workbooks.Add
........
........
wrBook.Save "C:\1.xls"
AppExl.Quit
Set AppExl = Nothing
Почему Outlook остается в памяти после закрытия?
На сайте microsoft сказано, что это при работе с Explorer-ом или Inspector-ом. Что мол нужно при событии close делать Explorer = Nothing. Делаю то же самое - не выгружается
Цитата:
Originally posted by e_s
На сайте microsoft сказано, что это при работе с Explorer-ом или Inspector-ом. Что мол нужно при событии close делать Explorer = Nothing. Делаю то же самое - не выгружается
На сайте microsoft сказано, что это при работе с Explorer-ом или Inspector-ом. Что мол нужно при событии close делать Explorer = Nothing. Делаю то же самое - не выгружается
Мало информации, покажи свой код.
Что касается Nothing, то это относится к любым объектам к которым ты получаешь доступ через CreateObject/GetObject.
Смысл такой: для окончания работы с объектом необходимо обнулить (=Nothing) ВСЕ объектные переменные указывающие на этот объект, потому что каждый раз когда указываешься какой-нибудь переменной на объект, то у объекта внутренний счетчик увеличивается на 1, когда ты делаешь =Nothing своей переменной у объекта счетчик уменьшается на 1. Вот, и пока счетчик объекта не станет равным нулю, windows не будет выгружать объект из памяти и он будет висеть в памяти.
Мораль - следите за своими ссылками-переменными и не забывайте обнулять их все.
Типичный пример ошибки:
Код:
- и наш Excel продолжает висеть в памяти. Почему? да патамушто у нас два переменные указывают на Excel, это: AppExl и wrBook. AppExl мы приравняли Nothing, а вот wrBook продолжает удерживать в памяти наш Excel. Т.е. надо было написать в конце так:
Set AppExl = Nothing
Set wrBook = Nothing
В том то и проблема, что Word с Excel выгружаются, а Outlook нет.
Я делаю =Nothing всем объектам, которые создавал.
Dim EvRegButton As Office.CommandBarButton
Dim oCommandBars As Office.CommandBars
Dim newCommandBar As Office.CommandBar
Public Sub InitHandler(ByRef app As Object)
Try
'Application
m_olApp = app
m_olExplorer = m_olApp.ActiveExplorer
CreateEvidenceButton()
AddHandler EvRegButton.Click, AddressOf EvRegButton_Click
'Adding handler for SelectionChange Event
AddHandler m_olExplorer.SelectionChange, AddressOf m_olExplorer_SelectionChange
'AddHandler m_olExplorer.Close, AddressOf m_olExplorer_Close
'Ctype is neccessary due to ambiguous names
AddHandler (CType(m_olExplorer, Outlook.ExplorerEvents_Event)).Close, AddressOf m_olExplorer_Close
Catch ex As System.Exception
End Try
End Sub
Private Sub m_olExplorer_Close()
UninitHandler()
End Sub
Public Sub UninitHandler()
Try
RemoveHandler EvRegButton.Click, AddressOf EvRegButton_Click
RemoveHandler m_olExplorer.SelectionChange, AddressOf m_olExplorer_SelectionChange
RemoveHandler (CType(m_olExplorer, Outlook.ExplorerEvents_Event)).Close, AddressOf m_olExplorer_Close
EvRegButton = Nothing
newCommandBar = Nothing
oCommandBars = Nothing
m_olExplorer = Nothing
m_olApp = Nothing
Catch ex As System.Exception
End Try
End Sub
После создания CommandBar и CommandBarButton перестал выгружаться.
Удаляю все Handlers, обнуляю все объекты. Всё равно не выгружается.
Я создаю объект
m_olExplorer = m_olApp.ActiveExplorer
с ним работаю.
Затем, по простоте душевной написал строку
oCommandBars = m_olApp.ActiveExplorer.CommandBars
и вот здесь создался ещё один объект типа Explorer.
нужно было писать m_olApp.m_olExplorer.CommandBars,
тогда второй експлорер не создается
Чтобы выгрузить Outlook из памяти надо применить его метод - Quit (метод объекта Application). Попробуй, должно сработать.