Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2019, 19:12   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию Помогите избавиться от утечки

Добрый вечер! Прошу помочь понять в чем проблема. Нижеприведенная функция крутится в таймере с интервалом 1сек и извлекает текущий адрес папки из проводника. Если смотреть в диспетчере, то с каждой секундой потребляемая память увеличивается на 50-60Кб. Почему так происходит и как это предотвратить?

Код:
uses 
 Winapi.ActiveX, SHDocVw, System.Win.ComObj, ShLWAPI;

function ExtractDirAddress(Wnd: HWND): string;
var
 ShellWindows: IShellWindows;
 CurrentWindow: SHDocVw.IWebBrowser2;
 ResultSize: DWORD;
begin
 ShellWindows:= CoShellWindows.Create; //полагаю что созданный экземпляр нужно в итоге освобождать, но в документации не нашел метода "Free" или чего-то подобного
  for var i:= 0 to ShellWindows.Count - 1 do
  begin
  if Supports(ShellWindows.Item(i), IWebBrowser2, CurrentWindow)
  then
  begin
   CurrentWindow:= ShellWindows.Item(i) as IWebBrowser2;
   if (EndsText(':\windows\explorer.exe', CurrentWindow.FullName)) and (CurrentWindow.HWND = Wnd)
   then Result:= CurrentWindow.LocationURL;
  end;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
var
 S: string;
begin
  S:= ExtractDirAddress(GetForegroundWindow);
  if S > ''
  then mmo1.Text:= '[' + TimeToStr(Now) + ']: ' + S;
end;

end;
garuna вне форума Ответить с цитированием
Старый 21.10.2019, 19:56   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
ShellWindows:= CoShellWindows.Create; //полагаю что созданный экземпляр нужно в итоге освобождать, но в документации не нашел метода "Free" или чего-то подобного
Интерфейсы освобождаются через nil. Но вообще и этого не требуется, так как там идёт подсчёт ссылок и при выходе из функции он так же автоматически удаляется.

Если считаете что дела в этом объекте сделайте его глобальным.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 21.10.2019, 19:59   #3
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Интерфейсы освобождаются через nil. Но вообще и этого не требуется, так как там идёт подсчёт ссылок и при выходе из функции он так же автоматически удаляется.

Если считаете что дела в этом объекте сделайте его глобальным.
Пробовал освобождать и через nil, и делать переменную ShellWindows глобальной - ничего не помогло

Цитата:
Но вообще и этого не требуется, так как там идёт подсчёт ссылок и при выходе из функции он так же автоматически удаляется.
Да, но что делать если этот код вызывается не один раз, а постоянно крутиться в таймере увеличивая с каждым разом потребляемую память? Неужели вручную никак нельзя освободить?

Последний раз редактировалось garuna; 21.10.2019 в 20:09.
garuna вне форума Ответить с цитированием
Старый 21.10.2019, 20:18   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
если этот код вызывается не один раз, а постоянно крутиться в таймере увеличивая с каждым разом потребляемую память? Неужели вручную никак нельзя освободить?
ReportMemoryLeaksOnShutdown := true;
Показывает что утечки нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 21.10.2019, 20:25   #5
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
ReportMemoryLeaksOnShutdown := true;
Показывает что утечки нет.
да, но в диспетчере нарастает память
garuna вне форума Ответить с цитированием
Старый 21.10.2019, 20:51   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Что тут можно сказать ваш код верный. Утечки в Delphi нет. Если утечка и есть, то она уровням ниже в shlwapi.dll. Вы как виндоус хотите переписать?

У меня в диспетчере память не растёт. Но вообще у меня win10 и там диспетчер задач очень странно показывает используемую память. Так что возможно дело в нём.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите как избавиться от информера Александр Николаев Свободное общение 2 16.10.2009 18:57
Помогите избавиться от порно! Тат Безопасность, Шифрование 1 08.07.2009 03:55
Помогите пожалуйста избавиться от ошибок Aronax Общие вопросы C/C++ 10 07.07.2009 12:21
Помогите избавиться от вируса. Titan123 Свободное общение 3 18.03.2009 17:40
Помогите избавиться от вируса Amen Операционные системы общие вопросы 45 10.03.2009 00:19