JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7270a0925b7a0120e69ec0ceb98874caMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Zeiger für Message-Handle

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 26.06.2006, 11:32    Titel: Zeiger für Message-Handle Antworten mit Zitat

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(4Cool : 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 12:57    Titel: Antworten mit Zitat

CPP:
LRESULT CALLBACK (*CallbackPointer)(HWND, UINT, WPARAM, LPARAM);


mit Dev-Cpp gab es keine Fehler!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 13:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 15:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.06.2006, 15:40    Titel: Antworten mit Zitat

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 Wink
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 16:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 17:28    Titel: Antworten mit Zitat

@Fallen:
Ob das letztendlich funktioniert, war mir ja (erstmal) egal, wollte ja nur wissen warum's nicht klappt bzw. den Rest später implementieren Wink

@GreveN:
Supi Smile
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 17:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 26.06.2006, 19:07    Titel: Antworten mit Zitat

Ich verstehe das zwar (noch) nicht 100%, werde da aber mal ein wenig recherchieren Wink

Dann mach ich mal das nächste Topic auf ... Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum