Childwindow und MemoryAccessViolation



  • hallihallo,

    ich hab ein kleines problem mit einem Childwindow:
    Und zwar wenn ich das fenster schließe udn dann über das menü ein neues erzeugen will, kackt mir das programm mit einer AccessViolation ab. ich weiß langsam nicht mehr woran das liegen könnte.

    Hier der Source:

    #include "windows.h"
    #include "resource.h"
    
    LRESULT CALLBACK WndProc(HWND hwnd2, UINT msg, WPARAM wParam, LPARAM lParam);
    LRESULT CALLBACK ChildProc(HWND hwnd1, UINT msg, WPARAM wParam, LPARAM lParam);
    
    HWND hwnd_1;
    HWND hwnd_2;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int cmdShow)
    {
    	WNDCLASSEX wc;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.cbClsExtra = NULL;
    	wc.cbWndExtra = NULL;
    	wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    	wc.hIconSm = NULL;
    	wc.hInstance = hInstance;
    	wc.lpfnWndProc = WndProc;
    	wc.lpszClassName = "MyWindowClass";
    	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    	wc.style = CS_VREDRAW | CS_HREDRAW;
    
    	if(!RegisterClassEx(&wc))
    		MessageBox(NULL, "Windowclass not created.", "Fehler", NULL);
    
    	wc.lpfnWndProc = ChildProc;
    	wc.lpszClassName = "MyWindowChildClass";
    	wc.lpszMenuName = NULL;
    
    	if(!RegisterClassEx(&wc))
    		MessageBox(NULL, "Windowclass not created.", "Fehler", NULL);
    
    	hwnd_1 = CreateWindowEx(WS_EX_APPWINDOW, "MyWindowClass", "Neues Fensterle",  WS_OVERLAPPEDWINDOW |  WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 800, 600, NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hwnd_1, SW_SHOW);
    
    	MSG msg;
    
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd2, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    		case WM_CREATE:
    		{
    			CreateWindowEx(WS_EX_APPWINDOW, "MyWindowChildClass", "Child1", WS_CHILD | WS_SYSMENU | WS_MINIMIZEBOX | WS_CAPTION | WS_VISIBLE, 0, 0, 300, 300, hwnd2, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
    			break;
    		}
    		case WM_COMMAND:
    		{
    			switch(LOWORD(wParam))
    			{
    				case ID_NEW_CHILDWINDOW:
    				{
    					CreateWindowEx(WS_EX_APPWINDOW, "MyWindowChildClass", "Child4", WS_CHILD | WS_SYSMENU | WS_MINIMIZEBOX | WS_CAPTION | WS_VISIBLE, 0, 0, 300, 300, hwnd2, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
    					break;
    				}
    				break;
    			}
    			break;
    		}
    		case WM_DESTROY:
    		case WM_CLOSE:
    		{
    			PostQuitMessage(0);
    			break;
    		}
    		case WM_SIZE:
    		{
    			return 0;
    			break;
    		}
    	}
    	return DefWindowProc(hwnd2, msg, wParam, lParam);
    }
    
    LRESULT CALLBACK ChildProc(HWND hwnd1, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    		case WM_CREATE:
    		{
    			break;
    		}
    		case WM_DESTROY:
    		{
    			//DestroyWindow(hwnd);
    			break;
    		}
    		case WM_CLOSE:
    		{
    			break;
    		}
    		case WM_SIZE:
    		{
    			return 0;
    			break;
    		}
    	}
    	return DefWindowProc(hwnd1, msg, wParam, lParam);
    }
    


  • lParam ist nur bei WM_CREATE ein LPCREATESTRUCT. Am einfachsten ist es, wenn du einfach bei WM_CREATE ((LPCREATESTRUCT) lParam)->hInstance in einer static Variable speicherst und diese dann verwendest...



  • ➡ GetModuleHandle(NULL) 😉 .



  • Funktioniert inzwischen, danke =)) :xmas1:


Log in to reply