Einzelnen Beitrag anzeigen

Centrii

Registriert seit: 18. Mai 2007
Ort: FDS
108 Beiträge
 
Delphi 2006 Architect
 
#1

Speicher läuft voll bei WMI....

  Alt 13. Aug 2007, 14:20
Hallo Delphianer

Hab ein Problem mit einer Function mit der ich Prozesse und was dazu gehört über WMI auslese. Es funktioniert alles wunderbar, nur läuft mir der Speicher voll und die "Handles" im Taskmanager erhöhen sich im Sekundentakt. Soweit erklärbar, ich komm sekündlich in der Function vorbei. Im folgenden Code passiert das in der while-Schleife, wenn ich die auskommentiere ist alles ok.

Delphi-Quellcode:
function TfProzesse.WMIEnumProcesses(Computer, User, Password: string): TPIArray;

  function GetCompName: string;
  var
    Buf : array[0..MAX_COMPUTERNAME_LENGTH] of Char;
    Size : DWORD;
  begin
    Size := SizeOf(Buf);
    if GetComputerName(Buf, Size) then
      Result := Buf
    else
      Result := '';
  end;

var
  FComputer: String;
  FUser: String;
  FPassword: String;
  Services : ISWbemServices;
  ObjectDefinition: ISWbemObject;
  ObjectSet : SWbemObjectSet;
  ObjectInstances: IEnumVariant;
  WMIObject : ISWbemObject;
  PropertySet : ISWbemPropertySet;
  WMIProperty : ISWbemProperty;

  TempObj : OleVariant;
  ObjValue : Cardinal;
  i : Integer;
resourcestring
  rsWMIError = 'WMI-Fehler';
begin
  if AnsiUpperCase(GetCompName) = AnsiUpperCase(Computer) then
  begin
    FComputer := '';
    FUser := '';
    FPassword := '';
  end
  else
  begin
    FComputer := Computer;
    FUser := user;
    FPassword := Password;
  end;
  i := 0;
  //Locator := TSWbemLocator.Create(Nil);
  try
    try
      Services := Locator.ConnectServer(FComputer, 'root\CIMV2',FUser, FPassword, '', '', 0, nil);
     if Services <> nil then
      begin
        Services.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
        Services.Security_.Privileges.Add(wbemPrivilegeDebug, True);
        ObjectDefinition := Services.Get('Win32_Process',
          wbemFlagUseAmendedQualifiers, nil);
        ObjectSet := ObjectDefinition.Instances_(0, nil);
        ObjectInstances := (ObjectSet._NewEnum) as IEnumVariant;
        while (ObjectInstances.Next(1, TempObj, ObjValue) = S_OK) do
        begin
            //hier werden die Prozesse ausgelesen
        end;
    end;
    finally
      Services := nil;
    end;
  except
    on e: Exception do
      raise e.Create(e.message);
  end;
end;
Nun die Frage, kann mir irgendjemand sagen wie ich das umgehe, oder was ich wieder freigeben muss um mein Problem zu beheben?

Ich bin mir ziemlich sicher das es daran liegt
Delphi-Quellcode:
while (ObjectInstances.Next(1, TempObj, ObjValue) = S_OK) do
begin
Über Vorschläge oder sogar Lösungen bin ich sehr Dankbar

Gruß Ruben
Ruben
  Mit Zitat antworten Zitat