Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dlaczego ten program zużywa tyle pamięci?

Ostatnio zmodyfikowano 2019-02-12 16:52
Autor Wiadomość
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ć?



C/C++
#include <windows.h>
#include <stdio.h>


#define ARGB_TO_COLORREF(a)     (COLORREF)(((a) & 0xFF00FF00) | (((a) & 0xFF0000) >> 16) | (((a) & 0xFF) << 16)) // ARGB to ABGR
#define BitmapPixel(b, x, y)    ((b)->pixels[(y) * (b)->width + (x)]) // pixel is ARGB
#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 ) // by Napalm
{
    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 );
   
    // Bitmap is stored top down as BGRA,BGRA,BGRA when used as
    // DWORDs endianess would change it to ARGB.. windows COLORREF is ABGR
    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 ) {
        //printf("found first 0x%08X pixel at (%d, %d)\n", pixel_color, rx, ry);
        //SetCursorPos(rx, ry);
    }
    else printf( "nonie" );
   
}

int main() {
   
    DWORD Color = 0x00FFFFFF;
   
    while( true ) {
        BITMAPCAPTURE grab;
        SetColor( & grab, Color );
        Sleep( 100 );
       
    }
   
}

P-173939
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ęć.
P-173940
« 1 »
  Strona 1 z 1