Welche Rolle spielen #define ?



  • Ich habe ein

    #define TESTNACHRICHT 12341
    

    angelegt das Programm ausgeführt, auf das Senden der Nachricht reagiert ➡ funktionierte.

    Als ich den Code dann in eine andere Anwendung eingebaut habe,
    kam die Message plötzlich nicht mehr in der WindowProc an.
    Obwohl ich zum Sendevorgang ein eindeutiges Fenster benannt habe,
    das die Message empfangen und abarbeiten sollte.

    Nachdem ich den Wert 12341 auf was anderes geändert habe lief es wieder.

    Kann mir das jemand kurz erklären?



  • Ein #define erzeugt eine einfache Textersetzung im Quelltext - jedes Vorkommen des Bezeichners TESTNACHRICHT wird ersetzt durch 12341, bevor der Compiler dein Programm zu Gesicht bekommt. Das klappt aber nur in der Übersetzungseinheit, in der das #define steht.

    PS: Übrigens solltest du Nachrichten nicht mit einer willkürlichen Kennung versehen - Windows reserviert weite Teile des verfügbaren Wertebereichs für systemeigene Nachrichten und interne Nachrichten einzelner Controls, wenn du selber etwas in diesem Bereich festlegst, sind Kollisionen unausweichlich.



  • Danke CStoll.

    Wie kann ich mich an Vorgaben orientieren? Ich dachte je individueller
    der Bezeichner des define ist, umso eher vermeide ich solche Kollisionen?

    Z.B. wird ja ein

    #define TESTNACHRICHTHANNYUNDNANNY 123
    

    nicht grad von irgendwem anders genutzt werden.



  • er meinte nicht den namen sondern die zahl {o;



  • Ja, der Name ist schon recht individuell, aber von dem sieht der Compiler überhaupt nichts mehr - der sieht nur den Wert 123 (und der ist alles andere als individuell). Für deine eigenen Nachrichten solltest du Werte relativ zu WM_APP oder WM_USER verwenden, die sind explizit für Eigennutzung vorgesehen.



  • Mr Evil schrieb:

    er meinte nicht den namen sondern die zahl {o;

    😃 ouch!

    #define IRGENDWAEGALWAS 0x8000
    

    Das und das HWND des Empfängers in SendMessage würden also ausreichen
    um auf Nr.sicher zu gehen, oder?



  • Wie gesagt, nimm keine absoluten Werte für deine Nachrichten. Damit kollidierst du mit hoher Wahrscheinlichkeit mit irgendeiner Systemnachricht. Besser ist so etwas:

    #define WM_TESTNACHRICHT WM_APP+0
    


  • Ok, habe just in diesem Moment schreiben wollen, da ich in einer
    Anwendung eben dieses gesehen habe:

    #define WM_TRAY_NOTIFY WM_APP + 1000
    

    Dank euch, in der Sache geht mir nun ein 💡 auf 🙂



  • ich glaub man kann auch WM_USER + X nehmen



  • CStoll schrieb:

    Wie gesagt, nimm keine absoluten Werte für deine Nachrichten. Damit kollidierst du mit hoher Wahrscheinlichkeit mit irgendeiner Systemnachricht. Besser ist so etwas:

    #define WM_TESTNACHRICHT WM_APP+0
    

    ist das kein absoluter wert? 😉
    wenn man ganz sicher gehen will, dass message id's nicht doppelt vorkommen: http://msdn2.microsoft.com/en-us/library/ms644947.aspx
    🙂



  • pale dog schrieb:

    CStoll schrieb:

    Wie gesagt, nimm keine absoluten Werte für deine Nachrichten. Damit kollidierst du mit hoher Wahrscheinlichkeit mit irgendeiner Systemnachricht. Besser ist so etwas:

    #define WM_TESTNACHRICHT WM_APP+0
    

    ist das kein absoluter wert? 😉

    Nein, das ist relativ zu WM_APP gesetzt 😉 (OK, WM_APP ist wiederum ein absoluter Wert, aber darum geht's hier nicht - der Wertebereich WM_APP..0xBFFF ist explizit für eigendefinierte Nachrichten der Applikation vorgesehen. (aber du hast recht, wenn man eindeutige Nachrichten-IDs für die Kommunikation zwischen verschiedenen Programmen braucht, ist RegisterMessage() der richtige Weg)


Anmelden zum Antworten