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

1

07.03.2014, 08:31

[C++ WINAPI] Fehler Unbehandelte Ausnahme [SOLVED]

Guten Tag,
Ich arbeite gerade mit der Winapi, und da habe ich es geschafft einen Fehler zu erzeugen. Bei dem ich total überfordert bin was dieser aussagt.
Der Fehler tritt auf den ich auf den Button Subtrahieren drücke.

Fehlermeldung:

Zitat

Unbehandelte Ausnahme bei 0x012A4B39 in Turmrechnen.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x000A0636


Quellcode:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
void CreateSubtrahierenWindow (HWND hWnd, HINSTANCE hInst)
{

    hSubStatictext = CreateWindow   ("STATIC",
                            TEXT("Subtrahieren"),
                            WS_VISIBLE | WS_CHILD | ES_CENTER,
                            0, 0,
                            300, 20,
                            hWnd,
                            (HMENU)ID_SUB_STATICTEXT,
                            hInst,
                            NULL);
    hSubVar1 = CreateWindow ("STATIC",
                                TEXT(""),
                                WS_VISIBLE | WS_CHILD | ES_CENTER,
                                20, 20,
                                100, 20,
                                hWnd,
                                (HMENU)ID_SUB_VAR1,
                                hInst,
                                NULL);
    hSubSymbole = CreateWindow  ("STATIC",
                            TEXT("-"),
                            WS_VISIBLE | WS_CHILD | ES_CENTER,
                            0, 30,
                            10, 20,
                            hWnd,
                            (HMENU)ID_SUB_SYMBOLE,
                            hInst,
                            NULL);
    hSubVar2 = CreateWindow ("STATIC",
                                TEXT(""),
                                WS_VISIBLE | WS_CHILD | ES_CENTER,
                                20, 40,
                                100, 20,
                                hWnd,
                                (HMENU)ID_SUB_VAR2,
                                hInst,
                                NULL);
    hSubEditBox = CreateWindow  ("EDIT",
                            "ergebnis",
                            WS_VISIBLE | WS_CHILD | WS_ACTIVECAPTION,
                            20, 60,
                            100, 20,
                            hWnd,
                            (HMENU)ID_EDITBOX_SUB,
                            hInst,
                            NULL);
    hSubBtnUeberpruefen = CreateWindow  ("BUTTON",
                                    "Überprüfen",
                                    BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                                    20, 100,
                                    95, 40,
                                    hWnd,
                                    (HMENU)ID_BTN_UEBERPRUEFEN_SUB,
                                    hInst,
                                    NULL);

    hSubBtnAbbrechen = CreateWindow ("BUTTON",
                                "Abbrechen",
                                BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                                175, 100,
                                95, 40,
                                hWnd,
                                (HMENU)ID_BTN_ABBRECHEN_SUB,
                                hInst,
                                NULL);

}

]LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//  static RECT    rect;

    switch (message)
    {
        case WM_DESTROY:
        {
            PostQuitMessage (0);
            return (0);
        }
        case WM_COMMAND:
        {
            switch (wParam)
            {
                case ID_BTN_SUBTRAHIEREN:
                {
                    CreateSubtrahierenWindow(hWnd, ((LPCREATESTRUCT) lParam)->hInstance);
                    return (0);
                }
            }break;
        }break;


    }
    return (DefWindowProc (hWnd, message, wParam, lParam));
}


Ich vermute das der Fehler in diesem Befehl liegt

C-/C++-Quelltext

1
CreateSubtrahierenWindow(hWnd, ((LPCREATESTRUCT) lParam)->hInstance);


Den wenn ich diesen Befehl direkt durch die Child-Items ersetze funktioniert es einwandfrei.

Vielen dank für eure Hilfe

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Lajah250« (09.03.2014, 17:11)


2

07.03.2014, 11:25

Gemäß der Dokumentation zeigt der LPARAM einer WM_COMMAND-Nachricht nicht auf auf ein CREATESTRUCT, sondern ist entweder 0 oder das Handle des auslösenden Controls. Du missverstehst also ein Fenster-Handle als Zeiger auf CREATESTRUCT, und beim Lesen von hInstance daraus wird deine Zugriffsverletzung ausgelöst.

Das Handle deines Moduls musst du dir stattdessen woanders herholen, siehe z.B. The Old New Thing – Accessing the current module's HINSTANCE from a static library.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Krishty« (07.03.2014, 11:30)


CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

3

07.03.2014, 17:36

Um Krishty's Gedanken weiter zu führen:
lparam ist ein Zeiger auf eine CREATESTRUCT, wenn message gleich WM_CREATE ist.

4

09.03.2014, 17:11

Ok vielen dank für den Tipp.
Nun ist es gelöst

Werbeanzeige