none
CreateWindowEx schlägt mit Release-Konfiguration fehl RRS feed

  • Frage

  • Ich erstelle mein Fenster folgendermaßen:

    if(!(m_hWnd = CreateWindowEx(WS_EX_APPWINDOW,m_pApplicationName,m_pApplicationName,WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_POPUP,posX,posY,screenWidth,screenHeight,NULL,NULL,m_hInstance,NULL)))
    		{
    			MessageBox(NULL,"Fehler beim Erstellen des Fensters!","Fehler",MB_OK|MB_ICONWARNING);
    		}

    m_pApplicationName ist zugewiesen, die Positionen auch und m_hInstance ist mit GetModuleHandle(NULL) implementiert.

    Das Problem ist, dass im Release-Build das Fenster nicht erstellt wird (m_hWnd = NULL)
    Im Debug-Modus funktioniert das aber einwandfrei. Sobald ich die Linkcode-Zeitgenerierung ausschalte im RElease funktioniert es auch dort.

    GetLastError liefert "Der Vorgang wurde erfolgreich beendet".

    Ich weiß echt nicht mehr weiter was ich machen soll und hoffe jmd kann mir helfen.

    Montag, 17. September 2012 16:20

Antworten

  • Und pAppName ist ein gültiger zeiger.

    Debugge doch mal und kontrolliere alle Zeiger der Strukturen.

    Wie ich das sehe hast Du in der WNDCLASSEX hIconSm nichtinitialisiert!


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Dienstag, 18. September 2012 13:11
    Moderator

Alle Antworten

  • 1. Du kannst auch in der Release Version debuggen.

    2. Probleme zwischen Debug und Release Version werden meistens durchnicht initialisiereVariablen ausgelöst.

    3. Zeige uns mehr Code, vor allem von allen Parametern.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Dienstag, 18. September 2012 05:58
    Moderator
  • Also dass keine Missverständnisse auftreten, mit Debug-Modus meinte ich Debug-Build, hab was verwechselt.

    Variablen hab ich alle relevanten auf 0 gesetzt->keine Lösung.

    Hier mal der Code von InitializeWindows:

    struct FIREBASE_API ConfigInfo
    	{
    		LPCSTR pAppName; /**<Name des Fensters*/
    		bool bFullscreen; /**<Gibt an, ob Vollbild(true) oder Fenstermodus(false). Bei true werden screenWidth und screenHeight ignoriert.*/
    		int screenWidth; /**<Breite des Fensters*/
    		int screenHeight; /**<Höhe des Fensters*/
    		int posX; /**<X-Wert der Fensterposition*/
    		int posY; /**<Y-Wertder Fensterposition*/
    
    	};

    // m_cfg ist vom Typ ConfigInfo

    WNDCLASSEX wc; DEVMODE dmScreenSettings; int screenWidth=0,screenHeight=0, posX=0,posY=0; g_pApplicationHandle = this; m_hInstance = GetModuleHandle(NULL); m_pApplicationName = m_cfg.pAppName; wc.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = m_hInstance; wc.hIcon = LoadIcon(NULL,IDI_WINLOGO); wc.hIconSm = wc.hIcon; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = m_pApplicationName; wc.cbSize = sizeof(WNDCLASSEX); if(!RegisterClassEx(&wc)) { MessageBox(NULL,"Fenster konnte nicht registriert werden!","Fehler",MB_OK|MB_ICONWARNING); } screenWidth = GetSystemMetrics(SM_CXSCREEN); screenHeight = GetSystemMetrics(SM_CYSCREEN); if(m_cfg.bFullscreen) { memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); dmScreenSettings.dmSize = sizeof(dmScreenSettings); dmScreenSettings.dmPelsWidth = (unsigned long)screenWidth; dmScreenSettings.dmPelsHeight = (unsigned long)screenHeight; dmScreenSettings.dmBitsPerPel = 32; dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN); posX=posY=0; } else { screenWidth = m_cfg.screenWidth; screenHeight = m_cfg.screenHeight; posX = m_cfg.posX; posY = m_cfg.posY; } if(!(m_hWnd = CreateWindowExA(WS_EX_APPWINDOW,m_pApplicationName,m_pApplicationName,WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_POPUP,posX,posY,screenWidth,screenHeight,NULL,NULL,m_hInstance,NULL))) { MessageBox(NULL,"Fehler beim Erstellen des Fensters!","Fehler",MB_OK|MB_ICONWARNING); } ShowWindow(m_hWnd,SW_SHOW); SetForegroundWindow(m_hWnd); SetFocus(m_hWnd); ShowCursor(false); return;


    Dienstag, 18. September 2012 09:37
  • Und pAppName ist ein gültiger zeiger.

    Debugge doch mal und kontrolliere alle Zeiger der Strukturen.

    Wie ich das sehe hast Du in der WNDCLASSEX hIconSm nichtinitialisiert!


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Dienstag, 18. September 2012 13:11
    Moderator
  • Den Release-Build-Debug kann man vergessen, statt 0x0000000 steht irgendeine Adresse, die Werte sind vollkommen anders, etc.

    hIconSm ist nun mit LoadIcon(NULL,IDI_WINLOGO) intiailisiert -> kein Erfolg. Der Rest dürft passen, hier das Programm:

    #include "../FireBase/FireBase.h"
    
    using namespace FireBase;
    
    System* g_pSystem = NULL;
    
    bool Update();
    
    int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP, char* pcCmd, int iCmd)
    {
        g_pSystem = new System;
    	if(!g_pSystem)
    	{
    		MessageBox(NULL,"Fehler bei der Speicherallokation für FireBase::System","Fehler",MB_OK|MB_ICONWARNING);
    		return 1;
    	}
    
    	ConfigInfo cfg;
    	ZeroMemory(&cfg,sizeof(ConfigInfo));
    
    	cfg.bFullscreen = false;
    	cfg.pAppName = "FireBase Engine Test";
    	cfg.posX = 0;
    	cfg.posY = 0;
    	cfg.screenHeight = 600;
    	cfg.screenWidth = 800;
    
    	if(!g_pSystem->Initialize(cfg))
    	{
    		MessageBox(NULL,"Fehler beim Initialisieren des Systems","Fehler",MB_OK|MB_ICONWARNING);
    		FB_DELETE(g_pSystem);
    		return 1;
    	}
    
    	g_pSystem->Run(Update);
    
    	g_pSystem->Shutdown();
    	FB_DELETE(g_pSystem);
    	
    	return 0;
    }
    
    bool Update()
    {
    	if(g_pSystem->GetInput()->IsKeyDown(VK_ESCAPE))
    		return false;
    
    	return true;
    }


    Dienstag, 18. September 2012 16:20
  • Wo steht statt 0x00 irgendeine Adresse.

    Man kann den Releasebuild nicht vergessen beim debuggen!
    Es wird ja einen Grund haben warum das Fenster nicht angelegt wird.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 19. September 2012 06:17
    Moderator
  • Naja, ich leere die Struct mit ZeroMemory. Im Debug-Build haben die einzelnen Elemente korrekt 0x00.
    Im Release-Build allerdings alle eine 0xb Adresse. Außerdem wird mir screenHeight zum Beispiel als ein Zahl im 10-stelligen Bereich angezeigt.

    Mittwoch, 19. September 2012 10:50