AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PSafeArray, Speicher steigt an

Ein Thema von thatsit · begonnen am 8. Feb 2013 · letzter Beitrag vom 20. Feb 2013
Antwort Antwort
thatsit

Registriert seit: 8. Feb 2013
2 Beiträge
 
#1

PSafeArray, Speicher steigt an

  Alt 8. Feb 2013, 17:21
Delphi-Version: 5
Hallo,

ich bräuchte mal Hilfe. Ich habe ein Programm geschrieben, wozu ich auch quelltext Beispiele im Netz gefunden hab usw. Folgendes Problem, es geht darum, dass der Inhalt einer Webseite nach bestimmten sachen wie Links oder Bildern durchsucht werden soll. Es klappt auch alles, nur steigt der Speicher meines Programmes permanent an umso öfter man die Funktion verwendet. Der Speicher scheint nicht wieder freigeben zu werden. Überall ist zu lesen man muss das SafeArray zerstören sonst bleiben die Ole Variants im Speicher und der steigt immer weiter an. Hab schon vieles versucht, VarClear, SafeArrayDestroy usw. Aber es ändert nichts, Speicher steigt bei erneutem Funktions durchlauf immer weiter. Nur Programm schließen hilft...

Code ist ähnlich diesem:

Code:
uses mshtml, ActiveX, COMObj, IdHTTP, idURI;

{ .... }

procedure GetImageLinks(AURL: string; AList: TStrings);
var
  IDoc: IHTMLDocument2;
  strHTML: string;
  v: Variant;
  x: Integer;
  ovLinks: OleVariant;
  DocURL: string;
  URI: TidURI;
  ImgURL: string;
  idHTTP: TidHTTP;
begin
  AList.Clear;
  URI := TidURI.Create(AURL);
  try
    DocURL := 'http://' + URI.Host;
    if URI.Path <> '/' then
      DocURL := DocURL + URI.Path;
  finally
    URI.Free;
  end;
  Idoc := CreateComObject(Class_HTMLDocument) as IHTMLDocument2;
  try
    IDoc.designMode := 'on';
    while IDoc.readyState <> 'complete' do
      Application.ProcessMessages;
    v     := VarArrayCreate([0, 0], VarVariant);
    idHTTP := TidHTTP.Create(nil);
    try
      strHTML := idHTTP.Get(AURL);
    finally
      idHTTP.Free;
    end;
    v[0] := strHTML;
    IDoc.Write(PSafeArray(System.TVarData(v).VArray));
    IDoc.designMode := 'off';
    while IDoc.readyState <> 'complete' do
      Application.ProcessMessages;
    ovLinks := IDoc.all.tags('IMG');
    if ovLinks.Length > 0 then
    begin
      for x := 0 to ovLinks.Length - 1 do
      begin
        ImgURL := ovLinks.Item(x).src;
        // The stuff below will probably need a little tweaking
        // Deteriming and turning realtive URLs into absolute URLs
        // is not that difficult but this is all I could come up with
        // in such a short notice.
        if (ImgURL[1] = '/') then
        begin
          // more than likely a relative URL so
          // append the DocURL
          ImgURL := DocURL + ImgUrl;
        end
        else
        begin
          if (Copy(ImgURL, 1, 11) = 'about:blank') then
          begin
            ImgURL := DocURL + Copy(ImgUrl, 12, Length(ImgURL));
          end;
        end;
        AList.Add(ImgURL);
      end;
    end;
  finally
    IDoc := nil;
  end;
end;
ich bin der Meinung der Teufel liegt hier
Zitat:
IDoc.Write(PSafeArray(System.TVarData(v).VArray));
Ich hab es auch schon mit einem extra angelegten SafeArray versucht, dann hinter her mit destroy. aber funktioniert irgendwie nicht. Das hat ja was mit Pointern zu tun. Wer schön wenn jemand ne Idee hätte, wie ich den Speicher wieder freibekomm oder es irgendwie über ne andere Array funktion realisiere.

Cheers
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: PSafeArray, Speicher steigt an

  Alt 8. Feb 2013, 17:32
Ach der liebe IE.

Der ist mistig Implementiert hat und Speicherlücken wenn man seine Interface entsprechenden den Vorgaben verwendet.
Probier einfach mal bei diversen Interfaces mit Auruf der _Release-Methode am Ende der Verwendung die internen Fehler des IE zu umgehen.
Aber alles schön mit try...except sichern damit dein Programm nicht kracht wenn die Fehler korrigiert werden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: PSafeArray, Speicher steigt an

  Alt 8. Feb 2013, 19:00
Zitat von MSDN (Microsoft):
Note When document.write or document.writeln is used in an event handler, you must also use document.close.
Keine Ahnung weshalb das close nur in einem Event Handler aufgerufen werden soll, aber ich würde das mal versuchen.
  Mit Zitat antworten Zitat
thatsit

Registriert seit: 8. Feb 2013
2 Beiträge
 
#4

AW: PSafeArray, Speicher steigt an

  Alt 20. Feb 2013, 21:39
bis jetz konnt ich noch kein erfolg verbuchen... habs mal mit twebbrowser nun probiert, dort wird der speicher nach jeder anfrage resettet so wie es sein sollte...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz