Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите, пожалуйста предотвратить утечку памяти. [D7, WinXP]


^Sanya ©   (2002-12-14 16:30:00) 

Как освободить объкт, созданный с помощью CreateOleObject ?

Пример:

var
ExcelApp: Variant;
begin
ExcelApp := CreateOleObject("Excel.Application");
try
...
finally
//как освободить ExcelApp, а то остаётся довольно большой процесс в памяти. Free, FreeAndNil не работают.
end;


В Справке написано "you can release the interface by assigning the Unassigned constant to that Variant."
Это как: "присвоить ExcelApp пустую константу"?

Заранее блгодарен.


^Sanya   (2002-12-14 18:22:00) [1]


> asmith (14.12.02 17:46)

Огромное Вам спасибо!
Утечек больше нет.


asmith   (2002-12-14 17:46:00) [2]

ExcelApp.Quit; // закрываешь саму апликацию Excel
ExcelApp := Unassigned; // разрушаешь интерфейсную ссылку на нее


^Sanya   (2002-12-14 17:24:00) [3]


> Song © (14.12.02 16:55)

Мне-то ничем, просто я думал, что память остаётся зарезервированной.
Но дело ещё и в том, что при повторении операции создаются ещё новыепроцессы и замещения не происходит(10 раз подряд запустил и проверил).
У меня 512Мб RAM, может её много и каждый раз WinXP резервирует новое пространство?
И ещё: в мониторе состояния RAM последняя(свободное пространство) уменьшается на пару-тройку мегов с каждым проходом подпрограммы и тоже самое с файлом подкачки(увеличивается) => явно видны последствия нескольких процессов.

Ещё у меня есть строка
WorkSheet := ExcelApp.Workbooks[1].WorkSheets[1];
но по-моему, она тут не причём.

Как быть?
ИМХО, это критично.


Song   (2002-12-14 16:55:00) [4]

А чем тебе критично что он останется?
UnAssigned вовсе не значит, что процесс удалится совсем, а значит что его адресное пространство теперь не закреплено и может заниматься по усмотрению системы (очень часто занимается тем же объектом Variant).


^Sanya   (2002-12-14 16:51:00) [5]


> sniknik © (14.12.02 16:36)

Пример я давно видел, он, к сожалению, мне не помог.
Может это не мой глюк, но:
в XP я могу легко смотреть на список процессов.
При Unassigned и не только Excel.exe всё равно остаётся в процессах(примерно 8Мб занимает!), пока я его сам не "убью".
Может проблема в OfficeXP?
Можно легко "валить" процесс excel.exe, но это как-то не по-человечески...
Как же быть?
Пожалуйста, помогите, горю...


sniknik   (2002-12-14 16:36:00) [6]

в примерах делают так
var
MSWord: Variant;
begin
...
MSWord := CreateOleObject("Word.Basic");
...
MSWord := Unassigned;
...

end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо