Ynnus
02.12.2004, 22:16
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:
[Warning] In function `Z14WndProcnennichP6HWND__jjl':
[Linker error] undefined reference to `TextOutA@20'
[Compiler-log:]
Compiler: Default compiler
Führt g++.exe... aus
g++.exe "C:\Dokumente und Einstellungen\Stefan.HOF\Desktop\Projekte\c++\winAPI\fenster.cpp" -o "C:\Dokumente und Einstellungen\Stefan.HOF\Desktop\Projekte\c++\winAPI\fenster.exe" -g3 -I"D:\Dev-C++\include\c++" -I"D:\Dev-C++\include\c++\mingw32" -I"D:\Dev-C++\include\c++\backward" -I"D:\Dev-C++\include" -L"D:\Dev-C++\lib"
C:\DOKUME~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...):
#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
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:
[Warning] In function `Z14WndProcnennichP6HWND__jjl':
[Linker error] undefined reference to `TextOutA@20'
[Compiler-log:]
Compiler: Default compiler
Führt g++.exe... aus
g++.exe "C:\Dokumente und Einstellungen\Stefan.HOF\Desktop\Projekte\c++\winAPI\fenster.cpp" -o "C:\Dokumente und Einstellungen\Stefan.HOF\Desktop\Projekte\c++\winAPI\fenster.exe" -g3 -I"D:\Dev-C++\include\c++" -I"D:\Dev-C++\include\c++\mingw32" -I"D:\Dev-C++\include\c++\backward" -I"D:\Dev-C++\include" -L"D:\Dev-C++\lib"
C:\DOKUME~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...):
#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