Problem mit WndProc



  • Mahlzeit!

    Bin gerade dabei mich in die Windows Programmierung einzuarbeiten und stecke gleich mal beim ersten Programm mit folgender Fehlermeldung fest:

    "undefined reference to `_Z7WndProcP6HWND__jjl@16'"

    Benutze die Eclipse C/C++ IDE mit dem MingW/G++ Compiler. Bibliotheken sind eingebunden, -mwindows is auch gesetzt. Was läuft hier falsch? 😞

    Danke im voraus!

    #include <windows.h>
    // Globale Variablen
    HINSTANCE hInst  	= 0;		// Programm-Handle
    char szAppName[] 	= "Basis"; 	// Name der Anwendung
    char szTitle[100]	= "Hallo Windows";	// Fenstertitel
    
    // Prototypen eigener Funktionen
    
    BOOL InitApplication();
    BOOL InitInstance(int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    // Der Programm Einstiegspunkt
    int WINAPI WinMain(	HINSTANCE hInstance,
    					HINSTANCE hPrevInstance,
    					LPSTR	  lpCmdLine,
    					int		  nCmdShow)
    {
    	MSG msg;				// Platz für eine Message
    	hInst = hInstance; 		// Handle der Instanz an eine globale Variable zuweisen
    	if(!InitApplication())	// Fenster registrieren
    		return FALSE;
    	if(!InitInstance(nCmdShow))	// Hauptfenster erzeugen
    		return FALSE;
    	while(GetMessage(&msg,NULL,0,0)) //Meldungsschleife
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return (msg.wParam);
    }
    
    //--------------------Fortsetzung----------------------
    
    BOOL InitApplication()
    {
    	WNDCLASSEX wc;							//Fensterklasse
    
    //Die Eigenschaften der Fensterklasse festlegen:
    
    	wc.cbSize 	= sizeof(WNDCLASSEX);								//Anzahl Byte dieser Struktur
    	wc.style 			= CS_HREDRAW | CS_VREDRAW;				// Fensterstile
    	wc.lpfnWndProc 		= (WNDPROC) WndProc;						// Fensterprozedur
    	wc.cbClsExtra 		= 0;									//Hier kann zusätzlicher Speicher reserviert werden
    	wc.cbWndExtra 		= 0;									//den das Programm für eigene Zwecke nutzt.
    	wc.hInstance 		= hInst;								//Handle dieser Instanz											
    	wc.hIcon			= LoadIcon( NULL, IDI_APPLICATION); 	//Standard Icon
    	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			// Standard Cursor Pfeil
    	wc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH); 	//Hintergrund der Client Area
    	wc.lpszMenuName 	= NULL;
    	wc.lpszClassName	= szAppName;
    	wc.hIconSm 			= LoadIcon( NULL, IDI_APPLICATION);
    
    	return RegisterClassEx(&wc);
    }
    
    BOOL InitInstance(int nCmdShow)
    {
    	HWND hWnd;
    	hWnd = CreateWindow(
    				szAppName,		 		//Name der Fensterklasse
    				szTitle,				//Titel des Fensters
    				WS_OVERLAPPEDWINDOW,	//Fensterstil //Lage des Fensters:					
    				CW_USEDEFAULT,			//x-Koordinate
    				0,						//y-Koordinate
    				CW_USEDEFAULT,			//Fensterbreite
    				0,						//Fensterhöhe
    				NULL,					//Handle: Elternfenster
    				NULL,					//Handle: Menue
    				hInst,					//Handle des Programms
    			NULL);					//Zeiger auf zusätzliche Daten
    	if( !hWnd)
    		return (FALSE);
    	ShowWindow(hWnd, nCmdShow);		//Fenster anzeigen.
    	UpdateWindow(hWnd);				//WM_PAINT-Meldung
    	return(TRUE);
    }
    


  • Du hast die WindowProc nur deklariert. Die Definition fehlt noch 😃



  • Wäre nett, wenn Du dazuschreiben könntest, in welcher Zeile der Fehler auftritt.

    Zunächst einmal fällt auf, daß Du die Initialisierung des Fensters und die CreateWindow in verschiedene Funktionen gepackt hast. Das macht eigentlich keinen Sinn. Laß die beiden Funktionen Initinstance und InitApplication weg und schreib die wc-Deklarationen und die CreateWindow in die WinMain.

    Der Fehler kommt vermutlich davon, weil Du wc.lpfnWndProc = (WNDPROC) WndProc in eine Funktion gepackt hast. Nach Abschluß der Funktion wird die WndClass aber ungültig. Dann findet der Compiler eine WndProc, die nicht deklariert oder nicht zugewiesen ist.



  • Elektronix schrieb:

    Wäre nett, wenn Du dazuschreiben könntest, in welcher Zeile der Fehler auftritt.

    Linkerfehler sind selten Zeilennummern zugeordnet 😉

    Elektronix schrieb:

    Der Fehler kommt vermutlich davon, weil Du wc.lpfnWndProc = (WNDPROC) WndProc in eine Funktion gepackt hast. Nach Abschluß der Funktion wird die WndClass aber ungültig. Dann findet der Compiler eine WndProc, die nicht deklariert oder nicht zugewiesen ist.

    Das ist Unsinn.



  • Elektronix schrieb:

    Der Fehler kommt vermutlich davon, weil Du wc.lpfnWndProc = (WNDPROC) WndProc in eine Funktion gepackt hast. Nach Abschluß der Funktion wird die WndClass aber ungültig.

    Darum registriert man sie ja auch vorher. Die WNDCLASS-Struktur wird danach afaik nicht mehr gebraucht.

    Elektronix schrieb:

    Dann findet der Compiler eine WndProc, die nicht deklariert oder nicht zugewiesen ist.

    Deklariert ist sie, nur die Definition fehlt.



  • mad_martin schrieb:

    Elektronix schrieb:

    Dann findet der Compiler eine WndProc, die nicht deklariert oder nicht zugewiesen ist.

    Deklariert ist sie, nur die Definition fehlt.

    Verflixt, das bring ich doch immer durcheinander... 😞


Anmelden zum Antworten