ScreenCapture



  • Hi Leutz,
    ich bin noch blutiger Anfänger und stecke im Lernen von C++ grade fest..
    Ich habe mir eine Konsolenanwendung in Microsoft Visual C++ geschrieben und rufe unter bestimmten Voraussetzungen die Funktion ScreenCapture(); auf. Umso öfter ich diese aufrufe umso schneller füllt sich mein Arbeitsspeicher bis schlussendlich bei ca. 4,5Mb mein App abkackt und nen Runtime Error ausspukt. Könnte mal bitte jemand drüberschauen ob ich da etwas falsch mache?

    
    bool ScreenCapture(int x, int y, int width, int height, LPCTSTR file) { // LPCSTR file = L"C:\\Users\\Public\\blabla.bmp";	
    	
            // get a DC compat. w/ the screen
    	HDC hDc = CreateCompatibleDC(0);
    
    	// make a bmp in memory to store the capture in
    	HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height);
    
    	// join em up
    	SelectObject(hDc, hBmp);
    
    	// copy from the screen to my bitmap
    	BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY);
    	CImage image;
    	image.Attach(hBmp);
    	image.Save(file, Gdiplus::ImageFormatBMP);
    		
    	// free the bitmap memory
    	DeleteObject(hBmp);
    
    	return 1;
    }
    
    Ich hoffe ich habe jetzt keine Spielregeln verletzt...
    Danke schonmal an dieser Stelle..


  • CreateCompatibleDC: aus der MSDN

    When you no longer need the memory DC, call the DeleteDC function. We recommend that you call DeleteDC to delete the DC. However, you can also call DeleteObject with the HDC to delete the DC.

    Bei 4.5Mb (was nicht viel ist) tippe ich auf systemressourcen die du nicht wieder zurückgibst an das System.

    Daumenregel: Bei WinAPI Funktionen die etwas erstellen immer nach dem Text in der MSDN suchen wo steht wie man das wieder los wird.

    EDIT: Kann sein dass das nicht alles war.



  • Danke für deinen Tipp, aber auch mit

    DeleteDC(hDc);
    ReleaseDC(hWnd, hDc); 
    DeleteObject(hDc);
    

    komme ich nicht weiter, bzw. der Speicher füllt sich immernoch..
    Hmmm, ich tappe da voll im Dunkeln... 😫



  • @gunni0815 sagte in ScreenCapture:

    BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY);

    Du holst hier mit GetDC(0) noch einen Device-Kontext, den Du nicht wieder freigibst (ReleaseDC).
    Also wahrscheinlich besser:

    HDC hdcScreen = GetDC(NULL);
    BitBlt(hDc, 0, 0, width, height, hdcScreen, x, y, SRCCOPY);
    ReleaseDC(NULL, hdcScreen);
    

Log in to reply