Как освободить память, используемую IHTMLDocument? - PullRequest
4 голосов
/ 19 мая 2011

есть ли способ освободить память после использования IHTMLDocument (IHTMLDocument2)?

В настоящее время я использую функцию EmptyWorkingSet , но мне кажется, что это не очень хороший способ сделать это

EmptyWorkingSet(GetCurrentProcess);

Даже освобождение TWebBrowser не помогает;Кажется, проблема в COM-классе IHTMLDocument, который не освобождается из памяти.Есть ясный способ выпустить это;что-то вроде Marshal.ReleaseComObject но доступно для Delphi?

Воспроизводится с меньшими потерями памяти, чем при использовании JavaScript, но все же.Если вы поместите две кнопки в верхней части формы и попробуете следующий код ...

uses MSHTML, SHDocVw;

type
  TForm1 = class(TForm)
  private
    WebBrowser: TWebBrowser;
    HTMLDocument: IHTMLDocument2;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser := TWebBrowser.Create(nil);
  TWinControl(WebBrowser).Parent := Self;
  WebBrowser.SetBounds(8, 39, ClientWidth-16, ClientHeight-47);
  WebBrowser.Navigate('http://maps.google.com/');
  HTMLDocument := WebBrowser.Document as IHTMLDocument2;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WebBrowser.Free;
  HTMLDocument := nil;
end;

Вы увидите потерю памяти после каждого освобождения WebBrowser.Когда я запускаю свой JavaSrcipt, он намного больше, чем 300 кБ, это около 1 МБ, и это может вызвать утечку памяти в случае, если я запускаю это много раз.

Большое спасибо

Ответы [ 4 ]

3 голосов
/ 19 мая 2011

Классы COM обычно должны быть освобождены, когда вы освобождаете все ссылки на них.Обычно это можно сделать, присвоив nil всем переменным, содержащим ссылки на их интерфейсы.

Для немедленного освобождения памяти, используемой COM-библиотеками DLL, вы можете использовать CoFreeUnusedLibrariesEx .

0 голосов
/ 11 июня 2015

Эта проблема мучает пользователей TWebbrowser целую вечность, и до сих пор нет решения;единственный способ освободить память, используемую TWebbrowser, - закрыть приложение и снова открыть его.

0 голосов
/ 19 мая 2011

Вы пробовали Навигация ('about: blank');до освобождения?Это уже должно освободить память.Я также думаю, что внутренние компоненты WebBrower (которые примерно такие же, как и Internet Explorer), хранят много вещей в памяти, просто для обслуживания истории и кэширования для любого другого TWebBrowser (или IWebBrowser2, чтобы быть болееопределенно), что может существовать в этом сеансе исполняемого файла, даже в (ближайшем) будущем.

Если вам повезет (и если вы используете Navigate или Navigate2), вы можетеизмените это, если вы вызываете с флагами, такими как navNoHistory, navNoWriteToCache и, возможно, другие.

0 голосов
/ 19 мая 2011

Я не знаю Delphi, но я работал с IHTMLDocument в C ++.Я считаю, что вам нужно вызвать метод Release ().Я также знаю, что для строк используется BSTR , так что это может быть другое место для поиска не освобождаемой памяти.

...