Unbehandelte Ausnahme -> GdipDisposeImage...



  • Hi Leute,

    ich wollte schon länger mal mit WINAPI/GDI+ mein eigenes Fenster kreieren und habe dazu folgendes gefunden:

    http://www.spieleprogrammierer.de/27-tutorials/10592-entwicklung-von-windows-gadgets/

    Dort geht es zwar um Gadgets, das Prinzip lässt sich jedoch leicht auf ein normales Fenster übertragen.
    Also gesagt getan. Bei mir läufts auch wie ich will. Jedoch habe auch ich(wie anscheinend schon einige im Netz) irgendwo einen Fehler gemacht,
    der folgende Meldung mit sich bringt:

    Unbehandelte Ausnahme bei 0x6bd64d72 in My Own Window.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00f9243c.
    

    Es führt zu:

    Image::~Image()
    {
        DllExports::GdipDisposeImage(nativeImage);
    }
    

    Diesen finde ich aber nicht und wollte euch fragen, ob ihr mir da weiterhelfen könnt. Das wäre echt toll.

    Im Grunde kommt diese Fehlermeldung beim Aufruf von GdiplusShutdown() soweit ich das verstanden habe. Das ergibt auch Sinn, da sie erst auftaucht, wenn ich
    das Fenster/die Anwendung schließe. Im Netz kann man heufig lesen, das noch ein Objekt nicht zerstört wurde, oder so. Das kann
    ich bei mir nicht erkennen.
    Hier mal den relevanten Code:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc, LPSTR lpCmdLine, int nCmdShow)
    {
    	WNDCLASSEX dsclass;
    
    	dsclass.cbSize				= sizeof(WNDCLASSEX);
    	dsclass.style				= 0;
    	dsclass.lpfnWndProc			= DSProc;
    	dsclass.cbClsExtra			= 0;
    	dsclass.cbWndExtra			= 0;
    	dsclass.hInstance			= hInstance;
    	dsclass.hIcon				= NULL;
    	dsclass.hCursor				= NULL;
    	dsclass.hbrBackground		= (HBRUSH) (COLOR_HIGHLIGHT +1);
    	dsclass.lpszMenuName		= NULL;
    	dsclass.lpszClassName		= "MyClass";
    	dsclass.hIconSm				= NULL;
    
    	if(!RegisterClassEx(&dsclass))
    	{
    		MessageBox(NULL, "Die Fensterklasse konnte nicht registriert werden", "ERROR", MB_ICONERROR);
    		return 1;
    	}
    
    	HWND hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOOLWINDOW, "MyClass", "Standard-Fenster", WS_POPUP,
    							   GetSystemMetrics(SM_CXSCREEN) / 2 - 400,
    							   GetSystemMetrics(SM_CYSCREEN) / 2 - 300,
    							   0, 0, NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hWnd, nCmdShow);
    	UpdateWindow(hWnd);
    
    	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
    	Bitmap background(L"Fenster.png");
    	HBITMAP hBackground = 0;
    
    	background.GetHBITMAP(Color(), &hBackground);
    
    	if(!hBackground)
    		return -1;
    
    	HDC hdcBackground = CreateCompatibleDC(0);
    
    	SelectObject(hdcBackground, hBackground);
    
    	MSG msg;
    
    	while(Run)
    	{
    		while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    
    		HDC hdcScreen = GetDC(hWnd);
    
    		HDC hdcTemp = CreateCompatibleDC(hdcScreen);
    
    		HBITMAP hTempBitmap = CreateCompatibleBitmap(hdcScreen, width, height);
    
    		SelectObject(hdcTemp, hTempBitmap);
    
    		BitBlt (hdcTemp, 0, 0, width, height, hdcBackground, 0, 0, SRCCOPY);
    
    		Write(hdcTemp, 50, 50, width, height);
    
    		GetWindowRect(hWnd, &WindowRect);
    
    		POINT WindowPosition = {WindowRect.left, WindowRect.top};
    
    		UpdateLayeredWindow(hWnd, hdcScreen, &WindowPosition, &BackgroundSize,
    							hdcTemp, &SourcePoint, 0, &blendPixelFunction, ULW_ALPHA);
    
    		DeleteDC(hdcTemp);
    
    		ReleaseDC(hWnd, hdcScreen);
    
    	}
    
    	DeleteDC(hdcBackground);
    
    	GdiplusShutdown(gdiplusToken);
    
    	return (int) msg.wParam;
    }
    


  • Der Destruktor deines GDI+-Objekts wird aufgerufen, nachdem GdiplusShutdown aufgerufen wurde. Eine Lösung wird sogar in dem verlinkten Code genannt. Siehe Zeile 207:

    } // ist dafür da, dass Gdiplus::Bitmap vor GDI+ zerstört wird
    

    Selbstverständlich (hoffe ich mal) musst du die dazugehörige { auch verwenden.



  • Oh man, diese geschweifte Klammer habe ich voll übersehen.
    Vielen Dank.

    Selbstverständlich (hoffe ich mal) musst du die dazugehörige { auch verwenden.
    

    Jap 😃

    Kann man dieses Thema irgendwie löschen lassen?


Anmelden zum Antworten