CallWindowProc () vs. Funktionszeiger



  • Martin Richter schrieb:

    Da eindeutig CallWindowProc verwendet werden soll, kann Microsoft jederzeit die Technik ändern und das was GWL_WNDPROC returniert zu etwas noch ganz anderem machen!
    Dein Programm würde in jedem Fall fürchterlich abrauchen...
    An solchen Inkompatibilitäten kann niemand Interesse haben. Du nicht, Dein Chef nicht, Dein Kunde nicht...

    Das Argument zieht auf den ersten Blick immer. 😞

    Gegeben sei aber mal folgender Code : (Sinn und Zweck des Codes ist nicht das Thema !)

    #define STRICT
    #include <windows.h>
    
    typedef LRESULT (CALLBACK *typ_1) (HWND,UINT,WPARAM,LPARAM);
    
    //-----------------------------------------------------------------------------
    LRESULT CALLBACK  WndProc ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
    //-----------------------------------------------------------------------------
     MessageBox (0,"WndProc","Hinweis",0);
     return 0;
    }
    //-----------------------------------------------------------------------------
    WINAPI            WinMain ( HINSTANCE, HINSTANCE, LPSTR, int ) {
    //-----------------------------------------------------------------------------
     typ_1 meine_cwp = WndProc;
    
     CallWindowProc ((WNDPROC) WndProc,(HWND) 1,2,3,4);
     meine_cwp      ((HWND) 1,2,3,4);
    
     return 0;
    }
    

    CallWindowProc () und meine_cwp () bewirken genau das gleiche : Lediglich einen Aufruf von "WndProc" mit vier Parametern.

    Sollte Microsoft vorhaben daran etwas zu ändern, dann würde das Auswirkungen auf sämtlichen Code haben, der "aufwärtskompatibel" geschrieben wurde.
    Somit zieht das Argument nicht mehr ganz so stark. 🙂

    Es mag doch unwichtig sein ob die "WndProc" nun selbst implementiert oder vom Betriebssystem vorgegeben ist. Hauptsache, sie lässt sich mit vier Parametern (hwnd,msg,wparam,lparam) anspringen.

    Die MSDN warnt davor, dass es sich bei der zurückgelieferten "WndProc" in einigen Fällen auch um die Adresse einer Struktur handeln kann.

    Nur dann hätte doch die Zeigervariante abrauchende und hammelbeinverlängernde Auswirkungen ?



  • Martin Richter schrieb:

    Wenn es der Duden schon duldet! 😃

    Das will gar nichts heißen :p

    Dennoch, ich möchte dich hiermit freundlich und nicht anonym darauf aufmerksam machen, daß das Apostroph vor dem Genitiv-'s', zumindest im deutschsprachigen Kontext, nicht verwendet werden sollte 😉


  • Mod

    merker schrieb:

    [Das Argument zieht auf den ersten Blick immer. 😞

    Gegeben sei aber mal folgender Code : (Sinn und Zweck des Codes ist nicht das Thema !)

    #define STRICT
    #include <windows.h>
    
    typedef LRESULT (CALLBACK *typ_1) (HWND,UINT,WPARAM,LPARAM);
    
    //-----------------------------------------------------------------------------
    LRESULT CALLBACK  WndProc ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
    //-----------------------------------------------------------------------------
     MessageBox (0,"WndProc","Hinweis",0);
     return 0;
    }
    //-----------------------------------------------------------------------------
    WINAPI            WinMain ( HINSTANCE, HINSTANCE, LPSTR, int ) {
    //-----------------------------------------------------------------------------
     typ_1 meine_cwp = WndProc;
    
     CallWindowProc ((WNDPROC) WndProc,(HWND) 1,2,3,4);
     meine_cwp      ((HWND) 1,2,3,4);
    
     return 0;
    }
    

    CallWindowProc () und meine_cwp () bewirken genau das gleiche : Lediglich einen Aufruf von "WndProc" mit vier Parametern.

    Sollte Microsoft vorhaben daran etwas zu ändern, dann würde das Auswirkungen auf sämtlichen Code haben, der "aufwärtskompatibel" geschrieben wurde.
    Somit zieht das Argument nicht mehr ganz so stark. 🙂

    Der Aufruf, den Du hier machst ist irregulär. Erlaubt ist CallWndProc nur mit einer gültigen Fensterprozedur. Und das ist eine die Du mit GetClassInfo bekommst, oder mit GWL_WNDPROC.
    Was Du hier machst ist gebastel!


Anmelden zum Antworten