Anfänger: Was ist falsch?



  • Hallo ich lerne gerade durch ein Tutorial WinAPI nur ich habe hier einen Fehler:

    E:\dokumente\C++\projekte\WinAPI\Fenster1\main.cpp In function `int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':
    62 E:\dokumente\C++\projekte\WinAPI\Fenster1\main.cpp a function-definition is not allowed here before '{' token
    62 E:\dokumente\C++\projekte\WinAPI\Fenster1\main.cpp expected `,' or `;' before '{' token
    E:\dokumente\C++\projekte\WinAPI\Fenster1\Makefile.win [Build Error]  [main.o] Error 1
    

    Code:

    #define STRICT
    #include <windows.h>
    
    //LRESULT ist ein typedef auf einen long Typ.
    //CALLBACK ist genau das gleiche wie WINAPI, CALLBACK sagt aus, dass diese Funktion von Windows aufgerufen wird.
    //HWND = Handle zu dem Fenster, für das die Nachricht bestimmt ist.
    //UINT = enthält die Kennziffer der Nachricht, für alle Nachrichten sind in winuser.h Konstanten deklariert
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    //Programmnamen
    const char szAppName[] = "Ein eigenes Fenster";
    
    //In jedem Windows API Programm brauchen wir die WinMain Funktion
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    
        HWND       hWnd; //Handle für das Fenster.
        MSG        msg;  //Windows Nachrichten abholen und bearbeiten.
        WNDCLASS   wc;   //Typ der Fensterklasse.
    
        wc.style         =  CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   =  WndProc;
        wc.cbClsExtra    =  0;
        wc.cbWndExtra    =  0;
        wc.hInstance     =  hInstance;                           //Handle zu unserer Programminstanz, damit nur unser Programm diese Fensterklasse benutzen kann.
        wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);          //Typ des Cursors.
        wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
        wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH); //Hintergrundfarbe
        wc.lpszClassName =  szAppName;                           //Fenstername
        wc.lpszMenuName  =  NULL;                                //Menü
    
        RegisterClass(&wc); //registriert bzw. meldet unsere Fensterklasse beim Fenstermanager von Windows an.
    
        hWnd = CreateWindow(szAppName,              //Fenstername
                            "Titelleiste",          //Text der Titelleiste
                            WS_OVERLAPPEDWINDOW,    //Stil des Fensters
                            CW_USEDEFAULT,          //X-Position auf dem Monitor
                            CW_USEDEFAULT,          //Y-Position auf dem Monitor
                            CW_USEDEFAULT,          //Fensterbreite
                            CW_USEDEFAULT,          //Fensterhoehe
                            NULL,
                            NULL,
                            hInstance,              //Handle auf unsere Programm Instanz
                            NULL);
    
        //Zeigt das Fenster an.
        //hWnd     = Handle auf unser Fenster.
        //iCmdShow = Wie das Fenster angezeigt werden soll(z.b. SW_SHOW)        
        ShowWindow(hWnd, iCmdShow);
        //Lässt den Anwendungsbereich, also den freien Fensterbereich, sofort nach dem Start neu zeichnen.
        //hWnd     = Handle auf unser Fenster.
        UpdateWindow(hWnd);
    
        //GetMessage(&msg, NULL, 0, 0):
        //Nachrichten aus der Warteschleife holen.
        //&msg = Gespeicherte Nachricht.
        while(GetMessage(&msg, NULL, 0, 0)){
                               TranslateMessage(&msg);
                               DispatchMessage(&msg);
        }
    
       return msg.wParam;
       LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ //ZEILE 62!!!!
         switch(message){
           case WM_DESTROY:{
             PostQuitMessage(0);
             return 0;
           }
         }
    
         return DefWindowProc(hWnd, message, wParam, lParam);
       }
    }
    


  • Ich hab denn Fehler gefunden 😃 also kann gelöscht oder gesperrt werden, danke



  • Also ich weis nicht was hier falsch sein soll:

    #define STRICT
    #include <windows.h>
    
    //LRESULT ist ein typedef auf einen long Typ.
    //CALLBACK sagt aus, dass diese Funktion von Windows aufgerufen wird.
    //Der erste Parameter ist der Handle zu dem Fenster.
    //Der zweite Parameter message enthält die Kennziffer der Nachricht.
    //Die nächsten beiden Parameter enthalten je nach Nachricht verschiedene Daten.
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
    
    const char szAppName[] = "Ein eigenes Fenster"; //Programmname.
    
    //Der erste Parameter HINSTANCE ist ein Handle auf diese Programminstanz.
    //Der zweite Parameter ist vom gleichen Typ, jedoch wird dieser Wert in Win 32 immer Null sein.
    //Der dritte Parameter enthält die Kommandozeilen Parameter.
    //Mit dem vierten Parameter wird übergeben, wie das eventuelle Fenster angezeigt werden soll (maximiert, minimiert usw.).
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    	HWND       hWnd; //Handle für unser Fenster.
    	MSG        msg;  //Windows Nachrichten abholen und bearbeiten.
    	WNDCLASS   wc;   //Typ der Fensterklasse.
    
    	wc.style         =  CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   =  WndProc;
    	wc.cbClsExtra    =  0;
        wc.cbWndExtra    =  0;
    	wc.hInstance     =  hInstance;
        wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
        wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
        wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.lpszClassName =  szAppName;
        wc.lpszMenuName  =  NULL;
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow(szAppName,
                            "Titelleiste",
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                            CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                            CW_USEDEFAULT,          /* Fensterbreite              */
                            CW_USEDEFAULT,          /* Fensterhoehe               */
                            NULL,
                            NULL,
                            hInstance,
                            NULL);
    
    	ShowWindow(hWnd, iCmdShow);
        UpdateWindow(hWnd);
    
    	while(GetMessage(&msg, NULL, 0, 0)){
    		TranslateMessage(&msg);
            DispatchMessage(&msg);
    	}
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    	switch(message){
    		case WM_DESTROY:{
    			PostQuitMessage(0);
    			return 0;
    		}
    	}
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Fehler von Dev-C++:

    C:\DOKUME~1\Tobias\LOKALE~1\Temp\cc6ddaaa.o(.text+0x71) In function `WinMain': 
      [Linker error] undefined reference to `GetStockObject@4' 
     C:\DOKUME~1\Tobias\LOKALE~1\Temp\cc6ddaaa.o(.text+0x71) ld returned 1 exit status
    


  • lord_fritte schrieb:

    Also ich weis nicht was hier falsch sein soll:

    Dann solltest du lernen, die Fehlermeldungen zu interpretieren.

    Der Linker beschwert sich, dass er GetStockObject nicht findet. Die MSDN Library sagt zu GetStockObject:

    Library: Use Gdi32.lib.



  • #pragma comment(lib, "gdi32.lib")



  • Ich hab das selbe Problem, das hat sich bei mir noch nicht geklärt.
    Wenn ich

    #pragma comment(lib, "gdi32.lib")
    

    als header in die Datei schreib kommt die selbe fehlermeldung.
    Benutze auch Dev-C++



  • wahrscheinlich weil der Compiler (g++) kein pragma kennt.
    Du musst in den Projekteinstellungen bei Linker mit angeben, dass gdi32.lib mitgelinkt werden soll.



  • Hat sich bei mir geklärt. Man muss bei Dev-C++ einfach ein neues Win 32 Projekt anlegen. Dann funktionierts.
    Trotzdem danke, Airdamn


Anmelden zum Antworten