Dlaczego ten program zużywa tyle pamięci?
Ostatnio zmodyfikowano 2019-02-12 16:52
laress Temat założony przez niniejszego użytkownika |
Dlaczego ten program zużywa tyle pamięci? » 2019-02-12 16:31:24 Doszedłem do tego że to nie działa bo przekracza obszar przydzielonej mu pamięci. Program chodzi 1 min i koniec. Kod jest znaleziony w internecie, dla mnie jest to na tyle zaawansowane że nie mam kompletnie pojęcia jak to działa. Nie widzę w którym miejscu jest zapisywana taka ilość pamięci. Wiem że to zapisuje bitmape pulpitu. Da się tą pamięć jakoś zwolnić? #include <windows.h> #include <stdio.h>
#define ARGB_TO_COLORREF(a) (COLORREF)(((a) & 0xFF00FF00) | (((a) & 0xFF0000) >> 16) | (((a) & 0xFF) << 16)) #define BitmapPixel(b, x, y) ((b)->pixels[(y) * (b)->width + (x)]) #define GetAValue(cr) (int)((cr) >> 24) #define ColorNoAlpha(p) ((p) & 0x00FFFFFF)
typedef struct _BITMAPCAPTURE { HBITMAP hbm; LPDWORD pixels; INT width; INT height; } BITMAPCAPTURE;
BOOL CaptureScreen( BITMAPCAPTURE * bmpCapture ) { BOOL bResult = FALSE; if( !bmpCapture ) return bResult; ZeroMemory( bmpCapture, sizeof( BITMAPCAPTURE ) ); HDC hdcScreen = GetDC( NULL ); HDC hdcCapture = CreateCompatibleDC( NULL ); int nWidth = GetSystemMetrics( SM_CXVIRTUALSCREEN ), nHeight = GetSystemMetrics( SM_CYVIRTUALSCREEN ); LPBYTE lpCapture; BITMAPINFO bmiCapture = { { sizeof( BITMAPINFOHEADER ), nWidth, - nHeight, 1, 32, BI_RGB, 0, 0, 0, 0, 0, } }; bmpCapture->hbm = CreateDIBSection( hdcScreen, & bmiCapture, DIB_RGB_COLORS,( LPVOID * ) & lpCapture, NULL, 0 ); if( bmpCapture->hbm ) { HBITMAP hbmOld =( HBITMAP ) SelectObject( hdcCapture, bmpCapture->hbm ); BitBlt( hdcCapture, 0, 0, nWidth, nHeight, hdcScreen, 0, 0, SRCCOPY ); SelectObject( hdcCapture, hbmOld ); bmpCapture->pixels =( LPDWORD ) lpCapture; bmpCapture->width = nWidth; bmpCapture->height = nHeight; bResult = TRUE; } DeleteDC( hdcCapture ); DeleteDC( hdcScreen ); return bResult; }
void SetColor( BITMAPCAPTURE * grab, DWORD pixel_color ) { int x, y, rx, ry, c, found; found = 0; for( y = 0; y < grab->height; y++ ) { for( x = 0; x < grab->width; x++ ) { if( ColorNoAlpha( BitmapPixel( grab, x, y ) ) == pixel_color ) { if( !found ) { rx = x; ry = y; found = 1; } } } } if( found ) { } else printf( "nonie" ); }
int main() { DWORD Color = 0x00FFFFFF; while( true ) { BITMAPCAPTURE grab; SetColor( & grab, Color ); Sleep( 100 ); } }
|
|
laress Temat założony przez niniejszego użytkownika |
» 2019-02-12 16:52:51 Dobra już znalazłem rozwiązanie DeleteObject( grab.hbm ); to zwolniło mi pamięć. |
|
« 1 » |