#define richtig mit WM_APP setzen
-
Ich muss zwischen zwei Dialogen einer Anwendung in einem Thread
mit SendMessage Nachrichten austauschen.Ich verwende
#define WM_MYMSGXYZ WM_APP+20Ich habe schon gelesen, dass es Kollisionen geben könnte.
Meint man damit Nachrichten, die in Windows bzw. in anderen Programmen
laufen?Also wenn z.B. calc.exe eine #define WM_BLA+20 hat, könnte es
bei mir im Programm knallen, wenn calc.exe das sendet?Oder wie muss man das verstehen?
-
Nur wenn in Deinem Programm noch andere Programmteile WM_APP+20 verwenden.
WM_APP+x Nachrichten sind für den eigenen Gebrauch in der eigenen Applikation reservier. Kollisionen sind ausgeschlossen, außer Du machst selber welche.
-
Sehr informativ! Wofür genau ist eigentlich WM_USER vorgesehen?
-
WM_USER ist für Nachrichten bzgl einer Fensterklasse. Alle Nachrichten wie z.B. die EM_ BM_ etc. achrichten fallen in diesen Bereich. Soltest Du also eine eigene CWnd Klasse aufbauen, steht es Dir frei WM_USER+x Nachrichten zu verwenden. Nur wenn Du das Fenster von CEdit ableitest solltest Du WM_USER+x meiden, denn WM_USER+x wird eben schon durch die EM_ Nachrichten verwendet.
-
Ok, dann hab ich es begriffen.

-
Aber zu diesem Thema habe ich nochmal eine Frage. Zunächst ist mir klar das WM_APP und WM_USER nur innerhalb eines Programms eindeutig zugewiesen sein müssen damit es keinen Chrash gibt. Was ist aber wenn man z.B. fremden Code einbindet (wegen mir einen Ownerdraw-Button, dem es bei codeproject gibt). Innerhalb dieses Codes wird z.B. irgendwo was mit WM_USER+20 definiert, ohne das man das auf den ersten Blick sieht. Nun definiere ich ebenfalls eine Message mit WM_USER+20, da ich es selbst ja noch nicht verwendet habe. Damit dürfte es ja zum Chrash kommen, wenn z.B. oben genannter Button auch gerade aktiv ist und damit arbeitet. Gibts eine Möglichkeit in der IDE sich solche Definitionen in einem Überblick anzuschauen?
-
Es gibt solange kein Problem solange nicht eine Nachricht fälschlicherweise an ein Fenster geschickt wird welches unter dieser Nachricht etwas anderes ("falsches") versteht.
Also.
Wenn du eine Button-Klasse X hast die WM_USER + 20 verwenden, und irgendeine andere Fensterklasse Y die auch WM_USER + 20 verwenden, dann ist das normalerweise garkein Problem. Zu einem Problem kann es werden wenn du die Message broadcasten willst, bloss broadcasten sollte man WM_USER + N oder WM_APP + N Messages sowieso nie.
----
Wenn du Fremden Code einbindest solltest du auf 2 Dinge achten:
- Der Fremde Code sollte wenn möglich keine WM_APP Messages verwenden. WENN er das tut, dann solltest du sicherstellen dass du die entsprechenden WM_APP nicht selbst verwendest.
- Der Fremde Code sowie auch dein eigener sollte WM_USER nur für das verwenden wofür es gedacht ist, nämlich als Messages für bestimmte Fensterklassen. D.h. es muss auch sichergestellt sein dass WM_USER Messages nicht an Fenster geschickt werden deren Typ (Fensterklasse) unbekannt ist.
Und rausfinden was wo verwendet wird kannst du einfach indem du nach WM_USER bzw. WM_APP suchst (find in files). Und hoffst dass nicht irgendein Schlaumeier die entsprechende Zahl "direkt" wo reingeschrieben hat.
-
Als Zusatz zu dem guten Infos die hustbaer schrieb:
Es empfiehlt sich, wenn man Klassen entwickelt, die in Libraries oder in anderen Projekten verwendet werden und die solche Nachrichten benötigen, unbedingt RegisterWindowMessage zu verwenden.
Die MFC kann mit ON_REGISTERED_MESSAGE auch damit umgehen.