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

22.03.2008, 10:34

Windows Anwendug lässt sich kompilieren aber nichts passiert

Tag Leute. Hab mich gestern an die Windows Anwendung des Buchs rangemacht (Ende Kap. 10)
Nachdem ichs fertig getippt hatte musste ich noch ein paar Fehler beseitigen, bis der Compiler keinen Fehler mehr ausgespuckt hat...
Tja, es hat fröhlich hincompiliert und als es fertig war geschah nix.

Nix öffnete sich und der Compiler gab nur folgende Meldung aus:

Quellcode

1
AppInit_DLLs loading eNetHook.dllc:\Users\OEM\Documents\Visual Studio 2008\Projects\Eine kleine Anwendung\Release\Eine kleine Anwendung.exeEine kleine Anwendung.exeDLL_PROCESS_ATTACH finishedThe program '[0x1560] Eine kleine Anwendung.exe: Native' has exited with code 0 (0x0).


Ich probier jetzt schon seit Stunden rum aber finde den Fehler nicht. Der Fehler muss irgendwo beim erstellen und registrieren des Fensters und des Fensterhandles sein, glaub ich.

Hier jetzt mal der Quellcode, aufgeteilt in den 4 Funktionen + Kopf:

Kopf:

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
#include <windows.h>

// Prototypen

//

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);

HWND ErstelleHauptfenster (HINSTANCE hInst);

void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst);
//

// Prototypen Ende



// ID's der Child Fenster

//

#define ID_STATICTEXT       4000
#define ID_EDITBOX          4001
#define ID_BTN_UEBERNEHMEN  4002
#define ID_BTN_BEENDEN      4003
//

// ID's der Child Fenster Ende


// Globale Variablen

//

HWND hText;         // Handle für den statischen Text

HWND hEditBox;      // Handle für die Editbox

HWND hUebernehmen;  // Handle für den Übernehmen Button

HWND hBeenden;      // Handle für Beenden Button

//

// Globale Variablen Ende


WinMain:

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
///////////////////////////

// HAUPTPROGRAMM WinMain //

///////////////////////////

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                    LPSTR lpcmdline, int ncmdshow)
{
    HWND hWnd;      // Fenster Handle

    MSG message;    // Nachricht


    // Hauptfenster erstellen

    hWnd = ErstelleHauptfenster (hInst);

    // Prüfen ob alle glatt ging

    if (hWnd == NULL)
        return (0);

    // Alle Steuerelemente erstellen

    ErstelleSteuerelemente (hWnd, hInst);

    // Nachrichtenschleife

    while (GetMessage (&message, NULL, 0, 0) )
    {
        TranslateMessage (&message);        // Messages für Callback übersetzen

        DispatchMessage  (&message);        // Messages nach Callback weiterleiten

    }

    // Programm beenden

    return (int)(message.wParam);

}   // WinMain Funktion Ende

    /////////////////////////////////////////////////


Hauptfenster erstellen:

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
/////////////////////////////////////////////////////   

// ErstelleHauptfenster Funktion                   //      

// Hauptfenster erstellen und Handle zurückliefern //

/////////////////////////////////////////////////////

HWND ErstelleHauptfenster (HINSTANCE hInst)
{
    HWND hWnd;              // Fenster Handle

    WNDCLASSEX windowclass; // Nachricht


    // Der Klassenamen des Fensters ist frei wählbar

    const char szClassName [] ="Zweites Fenster";

    // Struktur mit Eigenschaften füllen

    ////////////////////////////////////


    // Größe der Struktur zwischenspeichern

    windowclass.cbSize = sizeof (WNDCLASSEX);

    // Fenster beim verschieben neu zeichnen

    windowclass.style = CS_HREDRAW | CS_VREDRAW;

    // Funktionszeiger auf Callback Funktion

    windowclass.lpfnWndProc = WindowProc;

    // Keine extra Einstellungen

    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;

    // Instanz speichern

    windowclass.hInstance = hInst;

    // Icons und Cursor festlegen

    windowclass.hIcon   = LoadIcon  (NULL, IDI_APPLICATION);
    windowclass.hIconSm = LoadIcon  (NULL, IDI_APPLICATION);
    windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);

    // Hintergrundfarbe festlegen

    windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND-1;

    // Kein Menü

    windowclass.lpszMenuName = NULL;

    // Klassennamen angeben

    windowclass.lpszClassName = szClassName;

    // Fenster bei Windows registrieren

    if (!RegisterClassEx (&windowclass) )
        return (NULL);

    // Das Fenster erzeugen

    hWnd = CreateWindowEx (NULL,
                           szClassName,
                           "Eine kleine Anwendung",
                           WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                           CW_USEDEFAULT, CW_USEDEFAULT,
                           300, 135,
                           NULL,
                           NULL,
                           hInst,
                           NULL);

    // Fensterhandle zurückgeben

    return (hWnd);

}   // ErstelleHauptfenster Funktion Ende

    //////////////////////////////////////////


Steuerelemente erstellen:

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
/////////////////////////////////////

// ErstelleSteuerelemente Funktion //

// Alle Steuerelemente erstellen   //

/////////////////////////////////////

void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst)
{
    // Statischen Text als Child Fenster erstellen

    ///////////////////////////////////////////////

    hText = CreateWindow ("STATIC",                 
                          "Eingegebener Text",          
                          WS_VISIBLE | WS_CHILD | ES_CENTER,    
                          250, 10,                  
                          300, 20,                  
                          hWnd,                     
                          (HMENU)ID_STATICTEXT,     
                          hInst,                    
                          NULL);                    

    ////////////////////////////////////////////////


    // Editbox Child Fenster erstellen

    ///////////////////////////////////////////////

    hEditBox = CreateWindow ("EDIT",
                             "Bitte Text eingeben",
                             WS_VISIBLE | WS_CHILD | WS_BORDER,
                             0, 20,
                             300, 20,
                             hWnd,
                             (HMENU)ID_EDITBOX,
                             hInst,
                             NULL);

    ////////////////////////////////////////////////


    // Übernehmen Button als Child Fenster erstellen

    ///////////////////////////////////////////////

    hUebernehmen = CreateWindow ("BUTTON",
                                 "Übernehmen",
                                  BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                                  20, 50,
                                  95, 40,
                                  hWnd,
                                  (HMENU)ID_BTN_UEBERNEHMEN,
                                  hInst,
                                  NULL);

    ////////////////////////////////////////////////


    // Statischen Text als Child Fenster erstellen

    ///////////////////////////////////////////////

    hBeenden = CreateWindow ("BUTTON",
                             "Beenden",
                             BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                             175, 50,
                             95, 40,
                             hWnd,
                             (HMENU)ID_BTN_BEENDEN,
                             hInst,
                             NULL);

    ////////////////////////////////////////////////


}   // ErstelleSteuerelemente Funktion Ende

    //////////////////////////////////////////


Callback Funktion:

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
/////////////////////////////////////////

// CALLBACK FUNKTION                   //

// Empfängt Nachrichten und wertet aus //

/////////////////////////////////////////


LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
    // Messages auswerten

    switch (message)
    {
        // Fenster schließen?

        case WM_DESTROY:
        {
            // Nachricht zum beenden schicken

            PostQuitMessage (0);
            return (0);
        }

        // Ab hier die Nachrichten des Childs verarbeiten

        case WM_COMMAND:
        {
            switch (wParam)
            {
                // Wurde Übernehmen geklickt?

                case ID_BTN_UEBERNEHMEN:
                {
                    char szText[256];

                    // Text aus der Editbox holen

                    GetWindowText (hEditBox, szText, 256);

                    // Diesen Text in das Label schreiben und den Text in der Editbox löschen

                    SetWindowText (hText, szText);
                    SetWindowText (hEditBox, "");

                    return (0);
                }

                // Wurde beenden angeklickt?

                case ID_BTN_BEENDEN:
                {
                    int Resultat;   // Rückgabewert der Messagebox


                    // Messagebox für Sicherheitsabfrage

                    Resultat = MessageBox (hWnd, "Wirklich Beenden?",
                                           "Programm beenden",
                                           MB_YESNO | MB_ICONQUESTION);

                    // Wurde Ja angeklicht?

                    if (Resultat == IDYES)
                    {
                        // Ja, also Programm beenden

                        PostQuitMessage (0);
                        return (0);
                    }

                    // Nein also weiter

                    return (0);
                }
            } break;
        } break;
    }

    // Die Nachricht nich von uns, sondern von WIndows verarbeiten lassen

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

}   // Callback Funktion Ende

    ////////////////////////////////////////

                


Ich hoffe mir kann jmd. helfen.
MfG

2

22.03.2008, 10:52

Mir ist beim Überfliegen deines Codes erstmal nichts Frappierendes aufgefallen.
Meine Empfehlung:
Breakpoints setzen, Debugger anwerfen und schauen, wo er aussteigt... ;)

3

22.03.2008, 11:15

hä, beim Debuggen ruft der weder die Funktionen auf, noch springt er in die Nachrichtenschleife :?:

Am Ende der WinMain kommt eine Meldung:

Quellcode

1
There is no Source Code available for the current location

4

22.03.2008, 11:41

Der Fehler tritt beim Registrieren der Fensterklasse auf:

C-/C++-Quelltext

1
windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND-1; // <- da

Das "-1" raus, dann gehts.

5

22.03.2008, 12:13

oh verdammt... das is doch +1 .... :oops:

naja, vielen dank :)

6

22.03.2008, 12:18

Tja, beim Debuggen entdeckt. ;)
Ist aber 'ne hässliche Farbe (zumindest auf meinem Rechner)...

7

22.03.2008, 12:23

was +1 oder was? das ist standard...

8

22.03.2008, 12:31

Ja, dieses Standard (mit "d" ;) ) - Grau

9

22.03.2008, 13:01

lol warum wird denn das zensiert? :D

Werbeanzeige