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

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

1

27.01.2009, 15:51

Problem mit "CreateWindow"

hi,
ich habe seit längerem ein sehr lästiges problem. ich konnte den fehler soweit verfolgen, dass ich sagen kann, dass die oben genannte funktion den evtl auslösen könnte.

aber erstmal ne kleine herleitung. ich habe ein win32 programm, eine exe. es gibt nur die WinMain in der die nachrichtenschleife läuft.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*************************************************************************************
    WinMain
*************************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCmdLine, int iShowCmd)
{
    // Variables

    HawkResult  result;
    MSG         message = {0};

    // Mem leaks

#ifdef _DEBUG
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

    // Initialize

    if(Initialize())
        return 1;

    // Update

    //engine->Update(false);


    // Handle the messages

    while(WM_QUIT != message.message)
    {
        if(PeekMessage(&message, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }

        int* a = 0;
        *a = 5;

        // Uncomely avoiding (peekmessage())

        Sleep(00001);
    }

    // Release

    Release();

    return 0;
}


in der funktion "Initialize" wird eine klasseninstanz erstellt, die aus ner dll kommt. diese ruft nun eine funktion auf, die ein fenster erstellt.
in der nachrichtenschleife ist absichtlich eine benutzung eines null pointers verbaut. jetzt zum eigentlichen problem.

ich lasse das "Initialize" weg. er dritt dann ja sofort in die nachrichtenschleife ein und promt kommt eine fehlermeldung, die so aussieht(wird jeder schon mal gesehen habe ;)): http://www.file-upload.net/view-1411783/lalala.jpg.html

soweit verhält sich auch alles sowie es soll. wenn ich jetzt aber "Initialize" vorher aufrufe und somit zulasse, dass das fenster erstellt wird, was es auch ohne fehler tut, bekomme ich das problem. er erstellt das fenster ordnungsgemäß und geht dann auch in die nachrichtenschleife. allerdings bleibt jetzt die fehlermeldung fern und das ganze system friert ein. ich kann mich bestenfalls per "log off" retten oder schlimmsten falls reseten.

ich kann das fenster erstellen wie ich möchte, flags und parameter beliebig abändern. der fehler bleibt der gleiche -.-
evtl hatte schon mal jemand das gleiche problem oder weiß irgendwas drüber. ich wäre sehr dankbar, wenn er dann seine erfahrung teilen würde, da der fehler sehr nervend ist ;)

2

27.01.2009, 15:58

Ja, ich hatte mal ein ähnliches Problem.
Und da war der Fehler in der WinProc zu finden.
fka tm

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

3

27.01.2009, 16:00

sieht bei mir so aus:

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
29
30
/*************************************************************************************
    WindowProc
*************************************************************************************/
LRESULT WINAPI WindowProc(HWND _hWindow, unsigned int _uiMessage, WPARAM _WParam, LPARAM _LParam)
{
    // Variables

    PAINTSTRUCT paint = {0};

    switch(_uiMessage)
    {
    case WM_CLOSE:
        {
            PostQuitMessage(0);
        }break;

    case WM_PAINT:
        {
            BeginPaint(_hWindow, &paint);
            FillRect(paint.hdc, &paint.rcPaint, (HBRUSH)(GetStockObject(BLACK_BRUSH)));
            EndPaint(_hWindow, &paint);
        }break;

    default:
        {
            return DefWindowProc(_hWindow, _uiMessage, _WParam, _LParam);
        }break;
    }

    return TRUE;
}

eigentlich sollte alles ok sein ;)

Anonymous

unregistriert

4

27.01.2009, 16:01

Re: Problem mit "CreateWindow"

C-/C++-Quelltext

1
2
3
4
5
        int* a = 0;
        *a = 5;

        // Uncomely avoiding (peekmessage())

        Sleep(00001);

Was sind die 3 Zeilen denn bitteschön für ein Unsinn?! Erst auf einen Nullzeiger schreiben und dann ein Sleep für nix?

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

27.01.2009, 16:07

@ul
Das hab ich mir zuerst auch gedacht, aber dann den Text gelesen;)

Vielleicht liegt es daran, dass du bei der WndProc 1 zurückgibst, obwohl es eigentlich 0 sein sollte.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

6

27.01.2009, 16:11

die ersten beiden zeilen sind dafür da, dass ein runtime-error kommt. so produziert man den eben am leichtesten.
das sleep ist dafür da, das problem mit peekmessage zu umgehen. ich habe keine lust, laufen ne cpu auslastung on 100% auf einem kern zu haben. somit kann man es drücken. auf fast ca 0-1% im idle modus. is zwar ungewöhnlich, aber es geht ;)

7

27.01.2009, 16:12

Zitat von »"Helmut"«

Vielleicht liegt es daran, dass du bei der WndProc 1 zurückgibst, obwohl es eigentlich 0 sein sollte.


Vermute ich auch ... ;)
fka tm

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

8

27.01.2009, 16:17

dadran liegt es nicht. auch wenn ich

C-/C++-Quelltext

1
return 0;

schreibe, bleibt das fehlverhalten das gleiche.

9

27.01.2009, 16:20

Wie ihr das immer hinkriegt, mit der CPU-Auslastung... :?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   while(!done)
      {
         if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
            {
               if(msg.message == WM_QUIT)
                  {
                     done = true;
                  }

               TranslateMessage(&msg);
               DispatchMessage(&msg);
            }
         else
            {
               RenderScene();
            }
      }


Maximal 5% Idle.
fka tm

BlackSnake

Community-Fossil

  • »BlackSnake« ist der Autor dieses Themas

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

10

27.01.2009, 16:23

kp wie das zustande kommt. ist aber atm auch nicht wirklich mein problem ;).
ich habe jetzt die dll mal ganz weggelassen. nur die WinMain. in der main wird dann ein fenster erstellt und die nachrichtenschleife betreten, in der ich dann absichtlich den nullpointer eingebaut habe. selbes verhalten hier zu beobachten.

Werbeanzeige