 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 26.06.2006, 11:32 Titel: Zeiger für Message-Handle |
|
|
Hey,
wenn man ein Fenster erstellt, muss man der Struktur WNDCLASSEX ja den Zeiger einer Funktion (Callback-Funktion) übergeben, die bei eingehenden Nachrichten aufgerufen wird.
Nun wollte ich anstatt direkt einen Funktionsnamen, wirklich nur einen Zeiger übergeben, damit ich diesen wunderbar selbst lenken kann.
Ich habe wie folgt den Zeiger auf die Funktion festgelegt:
CPP: | LRESULT (*CallbackPointer)(HWND, UINT, WPARAM, LPARAM); |
Und ihn der WNDCLASSEX wie folgt übergeben:
CPP: | WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
CallbackPointer, // Callback-Funktion !!!
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"LBClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
|
Warum akzeptiert der Compiler das nicht ?
(Hier die Fehlermeldung)
--------------------Konfiguration: NetSpace - Win32 Debug--------------------
Kompilierung läuft...
Main.cpp
c:\coding\c++\entwicklung\netspace\window.h(44) : error C2065: 'Callbackpointer' : nichtdeklarierter Bezeichner
c:\coding\c++\entwicklung\netspace\window.h(44) : error C2440: 'initializing' : 'int' kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\entwicklung\netspace\window.h(47) : error C2440: 'initializing' : 'struct HINSTANCE__ *' kann nicht in 'int' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\entwicklung\netspace\window.h(4 : error C2440: 'initializing' : 'struct HICON__ *' kann nicht in 'int' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\entwicklung\netspace\window.h(49) : error C2440: 'initializing' : 'struct HICON__ *' kann nicht in 'int' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\entwicklung\netspace\window.h(50) : error C2440: 'initializing' : 'struct HBRUSH__ *' kann nicht in 'int' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\entwicklung\netspace\window.h(52) : error C2440: 'initializing' : 'char [8]' kann nicht in 'struct HINSTANCE__ *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\entwicklung\netspace\window.h(54) : error C2440: 'initializing' : 'struct HICON__ *' kann nicht in 'struct HINSTANCE__ *' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\coding\c++\sdk\x sdk 9.0\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
c:\coding\c++\entwicklung\netspace\directinputheader.h(3) : Hinweis C6311: c:\coding\c++\sdk\x sdk 9.0\include\dinput.h(42) : Siehe vorherige Definition von 'DIRECTINPUT_VERSION'
c:\coding\c++\entwicklung\netspace\management.h(330) : warning C4551: Dem Funktionsaufruf fehlt die Argumentliste
c:\coding\c++\entwicklung\netspace\management.h(340) : warning C4551: Dem Funktionsaufruf fehlt die Argumentliste
Fehler beim Ausführen von cl.exe.
NetSpace.exe - 8 Fehler, 2 Warnung(en)
_________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 26.06.2006, 12:57 Titel: |
|
|
CPP: | LRESULT CALLBACK (*CallbackPointer)(HWND, UINT, WPARAM, LPARAM); |
mit Dev-Cpp gab es keine Fehler! |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 26.06.2006, 13:13 Titel: |
|
|
Hm... Kannst du mal noch ein bisschen mehr Code zeigen? Du erzeugst das Fenster doch sicher irgendwo in einer Funktion/Methode, kannst du deren Prototypen mal zeigen? Erster Fehler klingt ein bisschen so, als wenn der Fehler da irgendwo liegen würde, vielleicht die Deklaration des Pointers in einem Prototypen falsch oder so... Naja, nur eine Vermutung, zeig' am besten noch die Stellen, an denen der Pointer eine Rolle spielt. |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 26.06.2006, 15:34 Titel: |
|
|
Der Pointer Spielt bisher noch nirgendwo eine Rolle ... Das dadurch das Programm beim Starten abstürzt, dürfte klar sein (ungültiger Adressenzugriff) aber es müsste 100% kompilierbar sein.
PS: Wenn ich den Pointer durch NULL ersetze, funktioniert alles tadellos.
Ich kann mal die Funktion geben, in der alles abläuft..
CPP: | void CWindow::CreateMainWindow(HINSTANCE hInstance) {
WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
Callbackpointer, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"LBClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
//wndClass.lbfnWndProc = CallbackPointer;
// // // // // // // //
// Notice:
// // // // // // // //
/*
typedef struct {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
*/
// // // // // // // //
// <- This is the body of the WNDCLASSEX-Structure
// // // // // // // //
RegisterClassEx(&wndClass);
_hWindow = CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"LBClass", // Klassenname
"Lost Bird ", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, 1024, 768, // Anfangsposition und Größe
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
} |
_hWindow ist dabei eine (private) variable der Klasse CWindow _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 26.06.2006, 15:40 Titel: |
|
|
Du weist im Grunde Müll der Klasse zu, ich wüsste auch nicht wie dir das was bringen würde in der späteren Entwicklung, denn du müsstest später den Callback erneut zuweisen.
Das einzige was du machen müsstest wäre aktuell aus:
Code: | LRESULT CALLBACK (*CallbackPointer)(HWND, UINT, WPARAM, LPARAM); |
Code: | LRESULT CALLBACK (*CallbackPointer)(HWND, UINT, WPARAM, LPARAM) = NULL; |
zu machen, aber wie gesagt der Sinn ergibt sich mir da nicht  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 26.06.2006, 16:07 Titel: |
|
|
Mat hat Folgendes geschrieben: | CPP: | void CWindow::CreateMainWindow(HINSTANCE hInstance) {
WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
Callbackpointer, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"LBClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
//wndClass.lbfnWndProc = CallbackPointer;
// // // // // // // //
// Notice:
// // // // // // // //
/*
typedef struct {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
*/
// // // // // // // //
// <- This is the body of the WNDCLASSEX-Structure
// // // // // // // //
RegisterClassEx(&wndClass);
_hWindow = CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"LBClass", // Klassenname
"Lost Bird ", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, 1024, 768, // Anfangsposition und Größe
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
} |
|
Und da ist es eben logisch, dass der Compiler meckert, dass 'Callbackpointer' ein unbekannter Bezeichner wäre, da er schlicht und einfach nirgendwo deklariert wird. Woher soll die Funktion denn 'Callbackpointer' kennen?
Versuchst du eine Klasse zu schreiben, welche ein Fenster repräsentiert und willst Dynamik dadurch gewinnen, dass du den Messagehandler von außen zuweist? Wenn ja, dann kann dir folgendes Codeschnippselchen eventuell helfen, ist allerdings schon sehr sehr alt:
CPP: | Window::Window(const WndSettings& settings,
const std::string& name,
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)){
hInstance_ = GetModuleHandle(NULL);
Settings_ = settings;
Name_ = name;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance_;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = Name_.c_str();
....
|
|
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 26.06.2006, 17:28 Titel: |
|
|
@Fallen:
Ob das letztendlich funktioniert, war mir ja (erstmal) egal, wollte ja nur wissen warum's nicht klappt bzw. den Rest später implementieren
@GreveN:
Supi
Also dein Codeschnippselchen passt ersteinmal oerfekt (hast meine Absicht richtig erkannt).
Eine Frage bleibt mir aber offen:
In meinem vorherigen Versuch war Callbackpointer doch ein Zeiger auf eine Funktion, wie sie von Windows gewünscht ist
CPP: | LRESULT CALLBACK (*CallbackPointer)(HWND, UINT, WPARAM, LPARAM); |
PS: Dieser Part steht in private der Klasse.
Die Funktion kennt Callpointer also .. Das Makro CALLBACK macht doch nichts anderes als dass die Nachfolgende Funktion als Zeiger (WNDPROC) angesehen wird oder ?
Ich verstehe also noch nicht so ganz, wo der Fehler bei meinem eigenem Ansatz steckt .. ;(
Aber trotzdem schonmal dickes Danke ! _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 26.06.2006, 17:45 Titel: |
|
|
Mat hat Folgendes geschrieben: | Das Makro CALLBACK macht doch nichts anderes als dass die Nachfolgende Funktion als Zeiger (WNDPROC) angesehen wird oder ? |
Nein, es hat zwar was indirekt mit Funktionszeigern zu tun, hat aber eigentlich eine andere Aufgabe. CALLBACK ist ein Makro für stdcall, d.h. die Funktion bekommt ihre Werte über den Stack geliefert. Weil die heutigen Compiler Funktionen richtig schön schnell machen können und die Parameter über Register übergeben, muss man __stdcall (oder hat CALLBACK)für Ruckruffunktionen angeben. Anders ausgedrück: Windows knallt alle Parameter für die Rückruffunktion auf den Stack (Stapel). Und damit man auch richtig daraufzugreifen kann, muss CALLBACK oder __stdcall dazu. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 26.06.2006, 19:07 Titel: |
|
|
Ich verstehe das zwar (noch) nicht 100%, werde da aber mal ein wenig recherchieren
Dann mach ich mal das nächste Topic auf ...  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|