Hallöchen,

ich orientiere mich gerade an einem Buch über Windowsprogrammierung (mit der WinAPI) in Verbindung mit C++. Dabei gibt es immer wieder Beispielcodes welche nicht funktionieren. Etwa ein Code mit dem WinAPI-Befehl TextOut (hdc, x, y, psText, iLength) ; .
(Das Buch: Windows Programming, by Charles Petzold, Ausgabe 1998)

Ich erhalte immer irgendwelche Fehler bezüglich ungültiger referencen in TextOut. Genaue Fehlermeldung:

Zitat Zitat
[Warning] In function `Z14WndProcnennichP6HWND__jjl':
[Linker error] undefined reference to `TextOutA@20'

[Compiler-log:]

Compiler: Default compiler
Führt g++.exe... aus
g++.exe "CDokumente und Einstellungen\Stefan.HOF\Desktop\Projekte\c++\winAPI\fenster.cpp" -o "CDokumente und Einstellungen\Stefan.HOF\Desktop\Projekte\c++\winAPI\fenster.exe" -g3 -I"DDev-C++\include\c++" -I"DDev-C++\include\c++\mingw32" -I"DDev-C++\include\c++\backward" -I"DDev-C++\include" -L"DDev-C++\lib"
CDOKUME~1\Stefan.HOF\LOKALE~1\Temp/ccOEbaaa.o(.text+0x27c): In function `Z7WndProcP6HWND__jjl':
C:/Dokumente und Einstellungen/Stefan.HOF/Desktop/Projekte/c++/winAPI/fenster.cpp:74: undefined reference to `TextOutA@20'

Ausführung beendet
(Ich verwende den Bloodshed Dev C++ Compiler - V. 4.9.8.0).

Dies ist der Code: (Eigentlich nur ein simples Hallo-Welt-Fensterprogramm welches aber schon Probleme macht...):
Code:
#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int showpref)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW ;// (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters
     
     ShowWindow (hwnd, SW_SHOWNORMAL) ;
     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)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
     TCHAR zeichen [40] = TEXT("Hallo, Windows XP");
     int length = 40;
     int pos = 20;
     
     switch (message)
     {
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          
          GetClientRect (hwnd, &rect) ;
  
          TextOut (hdc, pos, pos, zeichen, length) ;

          EndPaint (hwnd, &ps) ;
          return 0 ;
        
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam);
}
Wenn ich die Zeile mit TextOut() einkommentiere, funktioniert alles wie es soll, es wird ein leeres Fenster erstellt. Mit dieser Zeile sollte eigentlich dann ein Text in dem Clientbereich des Fensters erstellt werden, aber da kommt mir ja diese seltsame Fehlermeldung zuvor.

Ebenso gibt es weitere Beispiele in diesem besagten Buch welche mit TextOut() arbeiten welche nicht funktionieren und immer diesen gleichen Fehler ausgeben, mit der ungültigen Reference in TextOut().
Kennt jemand diesen Fehler oder weiß warum er auftaucht? Es ist ein wenig schlecht wenn man gern das Tutorial verstehen würde aber die Beispiele nicht funktionieren. Liegts vielleicht daran dass die Ausgabe des Buches von 1998 ist?

mfg.

Sunny