Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Meine Funktion hinterlässt Memoryleaks (https://www.delphipraxis.net/111151-meine-funktion-hinterlaesst-memoryleaks.html)

Neutral General 30. Mär 2008 17:12


Meine Funktion hinterlässt Memoryleaks
 
Hi,

Habe hier folgende Funktion. Ich schreibe da mit WriteProcessMemory in den Speicher des Taskmanagers.
Blöderweise steigt der Speicherverbrauch des Taskmanagers alle 2 Sekunden ca. um 2 MB....

Delphi-Quellcode:
function GetTaskManagerItemText(Index: Integer = -1): String;
var wnd1,wnd2,ListView: hwnd;
    ItemLoc,ItemGlob: PLVItemA;
    pid: Cardinal;
    hProc: THandle;
    Buffer: Array[0..255] of Char;
    bw: Cardinal;
begin
  Result := '[Error]';
  wnd1 := FindWindow('#32770',nil);
  wnd2 := FindWindowEx(wnd1,0,'#32770',nil);
  ListView := FindWindowEx(wnd2,0,'SysListView32',nil);

  if ListView <> 0 then
  begin
    GetWindowThreadProcessID(wnd1,pid);
    hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,
                         false,pid);
    if hProc <> 0 then
    begin
      ItemLoc := VirtualAlloc(nil,SizeOf(TLVItemA),MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
      ItemGlob := VirtualAllocEx(hProc,nil,SizeOf(TLVITemA)+SizeOf(Buffer),
                                 MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
    end
    else
      exit;

    try
      if Index = -1 then
        Index := SendMessage(ListView,LVM_GETSELECTIONMARK, 0, 0);

      with ItemLoc^ do
      begin
        mask := LVIF_TEXT;
        iItem := Index;
        iSubItem := 0;
        pszText := PChar(Cardinal(ItemGlob)+SizeOf(TLVItemA));
        cchTextMax := SizeOf(Buffer);
      end;

      WriteProcessMemory(hProc,ItemGlob,ItemLoc,SizeOf(TLVITemA),bw);
      ListView_GetItem(Listview,ItemGlob^);

      ReadProcessMemory(hProc,Pointer(Cardinal(ItemGlob)+SizeOf(TLVItemA)),@Buffer[0],256,bw);
      Result := Buffer;
    finally
      VirtualFreeEx(hProc,ItemGlob,SizeOf(TLVITemA)+SizeOf(Buffer),MEM_FREE or MEM_DECOMMIT or MEM_RELEASE);
      VirtualFree(ItemLoc,SizeOf(TLVItemA),MEM_FREE or MEM_DECOMMIT or MEM_RELEASE);
      CloseHandle(hProc);
    end;
  end;
end;
Und in diesem Thread wird die Funktion aufgerufen:

Delphi-Quellcode:
procedure AThread;
begin
  while not ThreadTerminated do
  begin
    if GetTaskManagerItemText = Filename then
      // DoSomething
    Sleep(1);
  end;
end;
Wo habe ich jetzt hier den Fehler drin?

Gruß
Neutral General

omata 30. Mär 2008 17:43

Re: Meine Funktion hinterlässt Memoryleaks
 
Schon mal mit MemProof getestet und die verantwortliche Quellcodezeile ermittelt?

Neutral General 30. Mär 2008 18:44

Re: Meine Funktion hinterlässt Memoryleaks
 
Hi,

Ja hab die Zeile gefunden. Ich habe VirtualFree falsch aufgerufen. Es muss so heißen:

Delphi-Quellcode:
VirtualFree(ItemLoc,0,MEM_RELEASE);
VirtualFreeEx(hProc,ItemGlob,0,MEM_RELEASE);
Es funktioniert jetzt. Danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 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