aus statischer methode nicht statische methoden aufrufen



  • hallo

    kann man das tun (s.o.) ?
    ich hab nämlich ein prob mit der wndproc der winapi.
    (eigentlich kömma in beide forums posten, aber hierhin passt es eher)
    wenn man eine klasse registriert definiert man ja eine wndproc
    wc.lpfnWndProc = (WNDPROC)&MessageProc;
    Die MessageProc darf aber keine normale methode sein, sonst kommt der fehler:

    "DevWindow.cpp": E2031 Cannot cast from 'long (* (_closure )(HWND__ *,unsigned int,unsigned int,long))(HWND__ *,unsigned int,unsigned int,long)' to 'long (__stdcall *)(HWND__ *,unsigned int,unsigned int,long)' in function TDevWindow::Register(unsigned int) at line 33

    wenn ich die MessageProc jetzt als static definiere, dann geht das.
    aber ich kann jetzt nicht mehr auf die methoden und werte der classe zugreifen die nicht static sind. es kommen z.b. solche fehler:

    "DevWindow.cpp": E2231 Member TDevWindow::MouseKey cannot be used without an object in function TDevWindow::MessageProc(HWND__ *,unsigned int,unsigned int,long) at line 78

    aber wie macht man das das es trotzdem funktioniert ?
    alles als static deklarieren ?? (eher sinnlos)



  • Du kannst aus einem statischen Kontext keine nicht-statische Methode aufrufen. Stell dir zum Beispiel mal das hier vor:

    class A {
      int foo;
    public:
      static void bar() { ++a; }
    };
    
    //...
    
    A::bar(); //was soll hier passieren?
    

    Wenn du A::bar() aufrufst, hast du keine Instanz der Klasse A, und deswegen auch kein foo, das inkrementiert werden könnte. Mit nicht-statischen Methoden ist es genauso - es fehlt der Kontext, auf den sich die Methode beziehen soll.



  • void bar();

    könnte auch so ausshen (intern):

    void a(A * this)
    {
    
    }
    

    Und this gibts nich ohne Instanz



  • Ich habe WinMain und WndProc beide global (die einzigen globalen Funktionen) und die sind bei mir beide um die 5 Zeilen lang.
    Ich würde nicht auf biegen und brechen etwas, was von Microsoft nun mal so designed wurde, in eine Klasse zwängen. Du kannst doch in der WndProc gleich deine eigene Klassenmethode aufrufen. 🙂



  • ... oder eine Thunk Klasse nehmen 🙄



  • [OT]
    Wenn man mittels WndProc Klassen verwalten will:
    Man übergibt bei CreateWindow den this Zeiger an WM_CREATE und setzt ihn dann dort per SetWindowLong für das HWND fest 🙂

    Dann kann man jedesmal mittels GetWindowLong den this Zeiger bekommen und machen was man will.
    [/OT]



  • also so oder?

    CREATESTRUCT createstruct;
        createstruct.lpCreateParams = this;
        hWnd = CreateWindowEx(FWindExStyle, FCaption.c_str(), FCaption.c_str(), FWindStyle, FLeft, FTop, FWidth, FHeight, NULL, NULL, FInstance, &createstruct);
    

    aber das funkt irgendwie net... CreateWindow will das Fenster dann nicht kreieren 😞

    achja der fehler kommt dann:
    1400 Invalid window handle. ERROR_INVALID_WINDOW_HANDLE


Anmelden zum Antworten