Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

13.09.2012, 19:26

Link-Zeitcodegenerierung macht Programm funktionsunfähig

Ich habe einen Code für ein Fenster geschrieben (von einem Tut), also das alles mit WNDCLASSEX, RegisterClassEx(), etc. etc.
Nun, das Fenster wird korrekt angezeigt, allerdings nur im Debug-Build. Im Release Build ist nichts und der Prozess läuft im Hintergrund.
Wenn ich im Release allerdings von Link-Zeitcodegenerierung zu keine Programmoptimierung wechsle, wird das Fenster auch bei RElease angezeigt.

Der relevante Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// Erstellt das Fenster mit den Einstellungen und holt den Handle
    m_hwnd = CreateWindowEx(WS_EX_APPWINDOW,m_applicationName,m_applicationName,WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_POPUP,posX,posY,screenWidth,screenHeight,NULL,NULL,m_hinstance,NULL);

    // Bringt das Fenster in den Vordergrund und setzt es fokussiert.
    ShowWindow(m_hwnd,SW_SHOW);
    SetForegroundWindow(m_hwnd);
    SetFocus(m_hwnd);

    // Versteckt den Mauszeiger
    ShowCursor(false);

    return;


Über den Debugger habe ich rausgefunden, dass im REleasebuild m_hwnd nach ShowWindow 0 wird.
CreateWindowEx fällt es auch nicht ein hwnd zu verändern.

Ich hoffe jmd kann mir helfen

mfg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

13.09.2012, 19:47

Nachdem du einen Release Build debuggest, kannst du diesen Werten keinen Glauben schenken. Ich bezweifle, dass es an der LTCG liegt. Ich eher würde mal vermuten, dass da irgendwo undefiniertes Verhalten im Spiel ist, das sich aber erst im optimierten Release Build bemerkbar macht. Bau mal eine ordentliche Fehlerebfrage ein und find raus, wo genau es fehlschlägt...

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

13.09.2012, 20:02

Also, sobald ich sie einschalte gehts wieder nicht, Außerdem ist es nur ein leeres Fenster: http://www.rastertek.com/dx11tut02.html

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

13.09.2012, 20:08

Was genau heißt "geht's wieder nicht"? Bei irgendeiner Funktion muss es ja fehlschlagen, bau also eben mal Fehlerabfragen ein und gib Meldungen aus wenn wo was fehlschlägt...

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

14.09.2012, 16:33

Also der Fehler tritt bei CreateWindowEx auf:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
m_hInstance = GetModuleHandle(NULL);
m_pApplicationName = L"Engine";
screenWidth = 800;
screenHeight = 600;
posX = (GetSystemMetrics(SM_CXSCREEN)-screenWidth) / 2;
posY = (GetSystemMetrics(SM_CYSCREEN)-screenHeight) /2;

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,L"Fenter konnte nicht erstellt werden!",L"Fehler!",MB_OK); // Wird bei Release ausgelöst, bei 
                // Debug nicht
    }

Die Variablen werden an verschiedenen Stellen initialisiert, ich fasse es nur zusammen.

Find ich irgendwie komisch.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

14.09.2012, 17:15

Was sagt GetLastError()?

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

14.09.2012, 19:12

"Der Vorgang wurde erfolgreich beendet":

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,L"Fenter konnte nicht erstellt werden!",L"Fehler!",MB_OK);
        DWORD err = GetLastError();
        LPCWSTR errMsg = NULL;
        if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,err,0,(LPTSTR)&errMsg,0,NULL))
        {
            MessageBox(NULL,errMsg,L"Fehler",MB_OK);
        }
        else
        {
            MessageBox(NULL,L"Auslesefehler!",L"Fehler",MB_OK);
        }
        
    }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »birdfreeyahoo« (14.09.2012, 19:19)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

14.09.2012, 19:27

Zitat von »http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx«

This function typically fails for one of the following reasons:
[...]
if one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE


Also zeig mal deine dazugehörige WndProc ;)

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

9

14.09.2012, 19:30

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
{
    switch(uMessage)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_CLOSE:
        {
            PostQuitMessage(0);
            return 0;
        }

    default:
        {
            return g_pApplicationHandle->MessageHandler(hWnd,uMessage,wparam,lparam);
        }
    }
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
    switch(umsg)
    {
        // Überprüft ob eine Taste gedrückt wurde.
    case WM_KEYDOWN:
        {
            // Wenn eine Taste gedrückt wurde, sende sie zum input-Objekt damit es das aufnehmen kann
            m_pInput->KeyDown((unsigned int)wparam);
            return 0;
        }

        // Überprüft ob eine Taste losgelassen wurde
    case WM_KEYUP:
        {
            // Wenn eine Taste losgelassen wurde dann sende sie zu dem Input-Objekt sodass es den Status zurücknehmen kann
            m_pInput->KeyUp((unsigned int)wparam);
            return 0;
        }

        // Alle anderen Nachrichten werden zum default handler weil unsere Anwendung keinen Gebrauch
        // von ihnen macht
    default:
        {
            DefWindowProc(hwnd,umsg,wparam,lparam);
        }
    }
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

14.09.2012, 19:32

Woher kommt g_pApplicationHandle? Hat das auch einen gültigen Wert?

Werbeanzeige