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