C++: WndProc funktioniert nicht



  • Hallo,
    Ich möchte ein WinApi Fenster erstellen doch bei der Kompilierung tritt immer diese Fehlermeldung auf:

    70	26	D:\Felix\c++\WinApi\Main.cpp	[Error] invalid conversion from 'long long int (*)(HWND, UINT, UINT, LONG) {aka long long int (*)(HWND__*, unsigned int, unsigned int, long int)}' to 'WNDPROC {aka long long int (*)(HWND__*, unsigned int, long long unsigned int, long long int)}' [-fpermissive]
    

    Hier nochmal der ganze Code:

    #include <iostream>
    #include <stdio.h>
    #include <time.h>
    #include <ctime>
    #include <cstdlib>
    #include <windows.h>
    
    using namespace std;
    
    char suser[] = "UserName";
    
    long long WINAPI WndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
    {
    	//Variablen
    	HDC hdc;                                                     //Handle für Gerätekontext
    	PAINTSTRUCT ps;                                       //Struktur für Zeichenoperationen
    	RECT rect;                                                           //Rechteckstruktur
    	  
    	switch (message)                                                    //Welche Nachricht?
    	{
    		case WM_PAINT:                                               //Fenster neu zeichnen
    		{
    			hdc=BeginPaint(hwnd,&ps);                        //Gerätekontext bereitstellen
    			GetClientRect(hwnd, &rect);                        //Größe der zu bearbeitenden
    			                                          //rechteckigen Fläche (Fensterinhalt,
    			                                                       //client area) ermitteln
    			                                                       
    			DrawText(hdc,suser,-1, &rect,                                   //Name des Users
    				                                                       //zentriert ausgeben
    				DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    				
    			EndPaint(hwnd,&ps);                                   //Gerätekontext freigeben
    			
    			return(0);
    		}
    		
    		case WM_DESTROY:                                                //Fenster schließen
    		{
    			
    			PostQuitMessage(0);                                           //WM_QUIT senden,
    			                                                   //um Message_Loop zu beenden
    			return(0);
    		}
    		
    		dafault:                                               //Andere Nachrichten. Werden
    		{                                                       //von den Windows-Standard-
    			                                                //Nachrichtenroutine bearbeiten
    			return DefWindowProc(hwnd,  message, wParam, lParam);
    		}
    	}
    }
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    					LPSTR lpCmdLine, int nShowCmd)
    {
    	//Variablen
    	static char szClassName[] = "KontocheckFensterKlasse";                       //Name der
    	                                                                        //Fensterklasse
    	WNDCLASSEX winclassex;                                         //Fensterklassenstruktur
    	HWND hwnd;                                                              //Fensterhandle
    	MSG msg;                                                          //Nachrichtenstruktur
    	
    	//exsistiert schon eine laufende Instanze dieser Anwendung?
    	//falls nein: Komponenten der winclassex struktur füllen
    	
    	if(!hPrevInstance)
    	{
    		winclassex.cbSize = sizeof(winclassex);
    		winclassex.style = CS_HREDRAW | CS_VREDRAW;
    		winclassex.lpfnWndProc = WndProc;
    		winclassex.cbClsExtra=0;
    		winclassex.cbWndExtra=0;
    		winclassex.hInstance=hInstance;
    		winclassex.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    		winclassex.hCursor=LoadCursor(NULL,IDC_ARROW);
    		winclassex.hbrBackground=(HBRUSH) GetStockObject( WHITE_BRUSH);
    		winclassex.lpszMenuName="Fenstermenu";
    		winclassex.lpszClassName=szClassName;
    		winclassex.hIconSm = LoadIcon( NULL, IDI_APPLICATION);
    		
    		RegisterClassEx(&winclassex);                                //Klasse registrieren
    	}
    	
    	//Neues Fenster erzeugen und Handle speichern
    	
    	hwnd=CreateWindow(szClassName,
    						"Fenster",
    							WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							1200,
    							1000,
    							NULL,
    							NULL,
    							hInstance,
    							NULL);
    							
    	//Neues Fenster anzeigen und sofort aktuelisiren
    	
    	ShowWindow(hwnd, nShowCmd);
    	UpdateWindow(hwnd);
    	
    	//Anfallende Nachrichten bearbeiten
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);                                      //Nachricht übersetzen
    		DispatchMessage(&msg);                           //Nachricht an Nachrichtenfunktion
    		                                                                     //weiterleiten
    	}
    	
    	return 0;
    }
    

    Kann mir irgendwer helfen? Ich benutze Dev c++ Compiler.



  • Kompilierst du für 64-bit? Die letzten beiden Parameter von WndProc passen nicht, s. WndProc.



  • Vielen Dank! Es lag an den letzten beiden Parametern. Aber wenn ich jetzt kompiliere kommt: [Error] ld returned 1 exit status



  • Da sollten dann aber vorher noch andere Fehler (oder Warnungen) erscheinen.



  • default, nicht dafault.



  • Ja du hast recht! Ich dachte zuerst die wäre nicht von Bedeutung:
    Main.cpp:(.text+0x168): undefined reference to `__imp_GetStockObject'



  • Du mußt noch die passende Lib zum Projekt hinzufügen ("Library Dependencies"), s.a. Undefined reference to GetStockObject@4 bzw. direkt GetStockObject - wird also wohl "gdi32.lib" sein.