Salve,
ho un problema con un applicazione scritta in delphi, dopo un po si blocca con l'errore "out of resource parametro non valido", o "out of resource memoria insufficente per eseguire il comando", il cursore lo mette sempre sulla stessa istruzione "ReleaseDC(GetDesktopWindow, tmpDC);" all'inizio usavo DeleteDC ma ho letto su msdn che quello va chiamato se lo crei il dc "CreateDC" invece se lo ottieni "GetDC" devi rilasciarlo appunto con ReleaseDC, anche se sono alle prime armi sono stato meticoloso e penso di aver liberato tutte le risorse nel miglior modo possibile,
posto un po di codice vi sarei molto grato se mi aiutate a risolvere sto problema
il dubbio che ho io e' che forse l'handle del LoadFromResourceName non viene rilasciato insieme alla bitmap con FreeAndNil, un altra cosa di cui non sono sicuro e' il puntatore che usa ScanLine, forse semplicemente mettendolo a Nil non libera la memoria, ma ci scrive Nullo dentro e poi ad ogni chiamata successiva alloca un altro pezzetto di memoria fino ad esaurirla, ma queste sono solo ipotesi di un principiante, l'unica cosa certa e' che l'esaurito sono io, non so piu dove sbattere la testa, spero di trovare aiuto in questo forum.codice:function FindBitmap(var x, y: Integer; SubBmp: TBitmap): Boolean; var cx, cy, scx, scy, i: Integer; Bmp: TBitmap; tmpDC: HDC; Line, SubLine: PRGB32Array; begin Result := False; Bmp := TBitmap.Create; tmpDC := GetWindowDC(GetDesktopWindow); Bmp.Width := screen.Width; Bmp.Height := screen.Height; BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, tmpDC, 0, 0, SRCCOPY); Bmp.PixelFormat := pf32bit; ReleaseDC(GetDesktopWindow, tmpDC); SubBmp.PixelFormat := pf32bit; for cy := 0 to Bmp.Height - 1 do begin if cy >= (Bmp.Height - Subbmp.Height - 5) then Break; Line := Bmp.ScanLine[cy]; SubLine := SubBmp.ScanLine[0]; for cx := 0 to Bmp.Width - 1 do begin if cx >= (Bmp.Width - SubBmp.Width - 5) then Break; if (RGB(Line[cx].R, Line[cx].G, Line[cx].B) = RGB(SubLine[0].R, SubLine[0].G, SubLine[0].B)) then begin i := 0; for scy := 0 to SubBmp.Height -1 do begin if scy >= SubBmp.Height -1 then break; Line := Bmp.ScanLine[cy + scy]; SubLine := SubBmp.ScanLine[scy]; for scx := 0 to SubBmp.Width -1 do begin if scx >= SubBmp.Width -1 then break; if (RGB(Line[cx + scx].R, Line[cx + scx].G, Line[cx + scx].B) = RGB(SubLine[scx].R, SubLine[scx].G, SubLine[scx].B)) then Inc(i); end; end; if i = scx * scy then begin Result := True; x := cx; y := cy; FreeAndNil(Bmp); Line := nil; SubLine := nil; Exit; end; end; end; end; FreeAndNil(Bmp); Line := nil; SubLine := nil; end; ////////////////////////////////////////////// la funzione findbitmap la chiamo passandogli delle bitmap che carico da un file .res SBmp:= TBitmap.Create; SBmp.LoadFromResourceName(HInstance, 'nome_della_bitmap'); if FindBitmap(x, y, SBmp) then begin ........ end; // e poi libero FreeAndNil(Sbmp);
Saluti.

Rispondi quotando
