Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: WMI (Windows Management Instrumentation) + Demo

  Alt 19. Jun 2009, 14:35
Es hat zwar gedauert, aber ich konnte nun an 4 Stellen ein Speicherleck bei den COM-Variants entdecken
und der "Fehler" liegt in IEnumVariant.Next, welches einen eventuell vorhandenen Variant im Parameter rgVar einfach so überschreibt und die enthaltenen Daten nicht freigibt.

Code:
STDMETHODIMP
CEnumVariant::Next(ULONG cElements, VARIANT FAR* pvar, ULONG FAR* pcElementFetched)
{
   HRESULT hr;
   ULONG l;
   long l1;
   ULONG l2;

   if (pcElementFetched != NULL)
      *pcElementFetched = 0;

   if (pvar == NULL)
      return E_INVALIDARG;

   for (l=0; l<cElements; l++)
      [color=#ff0000]VariantInit(&pvar[l]);[/color]
also liegt die Ursache direkt in de Eingeweiden von MS und selbst im MSDN konnt ich noch keinen Hinweis auf dieses Verhalten finden (wurde nur zufällig auf die Sourcen der Funktion aufmerksam gemacht)
[edit]
nach etwas rumklicken hab ich doch noch was gefunden
Zitat:
Diese Methode gibt einen Verweis auf die aufgelisteten Elemente zurück. Dieser Parameter wird nicht initialisiert übergeben.
ist aber auch sehr leicht zu übersehen
PS: in der Delphi-OH steht dieser Hinweis nicht drin.
[/edit]



Hab also mal ein paar VarClear "vor" dem Aufruf dieser Funktion eingebaut und scheinbar gibt es nun keinen "unnormalen" Anstieg des RAM-Verbrauchs mehr.

Zusäzlich hab ich mir gleich mal erlaubt die Exceptions zu überarbeiten (hab da in der Zwischenzeit etwas dazugelernt )

Nja, falls das nun alle Speicherlöscher waren, müßt ich dann mal irgendwann die eingefügten Befehler etwas aufräumen und besser verteilen (wurde eben etwas größzüg damit umgegangen )


[add2]
ist schon inteessant, wie man mit etwas anderem/neuerem Wissen dann doch noch endlich mal ein schon einige Jahre altes Problem lösen kann (hoff ich mal)
Angehängte Dateien
Dateityp: pas wmi_167.pas (39,1 KB, 128x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat