Selon le getMessage API de MSDN Bibliothèque, cela pourrait renvoyer -1 quand il y a une erreur. Le document fournit un extrait de code d'erreur commune à éviter:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
4 Réponses :
Vous devez suivre les règles spécifiées dans la documentation MSDN pour L'équipe Visual Studio est séparée de l'équipe Windows et il s'agit des mêmes erreurs que tout le monde! P>
i réalité, je ne peux jamais imaginer getMessage () code>. Il est indolore de le faire et ce n'est pas comme si vous avez un grand nombre de boucles de messages éparpillées sur votre code. P>
getMessage () code> retourner une erreur, mais c'est la nature du traitement des erreurs - cela ne signifie pas que vous ne devez pas gérer correctement les erreurs. P >
Je viens de constater qu'il existe une série d'articles de MSDN appelé "Apprendre au programme pour Windows en C ++". Et le échantillon de basewindow ne vérifie pas Pour la valeur de retour de -1 dans la boucle principale du message.
La documentation que vous mentionnez dit: p>
S'il y a une erreur, la valeur de retour est -1. Par exemple, la fonction échoue si hwnd em> est une poignée de fenêtre non valide ou lpmsg em> est un pointeur non valide. P> blockQuote>
Dans votre deuxième exemple, ces deux cas sont couverts:
msg code> est une structure typique de la pile-pile, donc& msg code> sera toujours un pointeur valide.NULL code> est transmis dans le paramètrehwnd code> et est une valeur acceptée pour ce paramètre.wmsgfiltermin code> etwmsgfiltermax code> est à la fois zéro, qui est également une combinaison valide. P>SO
getMessage () code> ne échoue pas lors de la validation des paramètres. La documentation ne mentionne pas clairement si elle renvoie également-1 code> dans d'autres situations (mémoire épuisée, par exemple). Cela dit, j'ai appelégetMessage () code> de la même manière que votre deuxième exemple depuis un moment et je n'ai jamais vu retourner-1 code> et tournant Ma boucle de message dans une boucle infinie. Votre kilométrage peut varier, bien sûr, mais il semble assez sûr de le faire. P>
Presque tous les projets que je travaille sur ne pas vérifier le retour pour -1, alors je pense que je suis assez sûr.
étant donné que VS vous donne un code erroné par défaut, et personne ne semble se soucier, il est très probable que cela ne provoque aucun problème dans les versions actuelles de Windows EM>. P>
Il est possible qu'une future version de Et malgré tout cela, vous devriez toujours suivre la documentation. P> getMessage code> sera em> retour -1. Toutefois, étant donné que le code erroné doit être dans de nombreuses applications existantes à présent, cela annulerait une énorme quantité de code existant. Compte tenu de la dédicace de Microsoft à la compatibilité à l'arrière, je pense qu'il est très improbable qu'ils changent de comportement de getMessage code> que tant de programmes s'appuient sur. P>
Je n'ai jamais rencontré de problèmes en ne vérifiant pas le retour de -1, mais quand j'ai vu le document, je suis confus. En ce moment, je suis en train de rester avec quel document dit. Et affirmer () lorsque GetMessage renvoie -1.
Le code VS généré pour une application par défaut est correct car il ne transmet aucun filtre et fournit un msg * code> -Argument. Si vous lisez la documentation pour getMessage code> Il nomme explicitement ces 2 modes d'erreur. Plus bas où il lit "Évitez le code comme celui-ci:" i> Il montre un exemple avec un filtre hwnd code>. D'autres modes d'erreur sont possibles, mais ceux-ci sont catastrophiques et ne peuvent pas raisonnablement être traités de toute façon. Ou comment allez-vous récupérer d'une file d'attente de message corrompue? À ce moment-là, c'est un jeu sur, 2p up.
My Gut (aka Raymond Chen Puissances psychiques) Me dit que Tout dépend de la manière dont vous voulez être formel. Je testerais spécifiquement -1 dans une application commerciale, mais pas dans un peu d'utilité écrite pour un usage personnel. P> getMessage (& msg, null, 0, 0) code> ne retournera qu'en1 dans le cas d'une défaillance catastrophique extrêmement rare, comme la corruption de la file d'attente de messagerie. Dans ce cas, le test est quelque peu attrapé STD :: Bad_alloc dans un programme C ++: Quand cela se produit, il est probablement trop tard pour faire quoi que ce soit à ce sujet. Laisser le processus accrocher (en ignorant getMessage () == -1) ou mourir (en ne pas attraper BAD_ALLOC) est acceptable, sauf si bien sûr ledit processus ne contrôle une centrale nucléaire. P>
Si les centrales nucléaires ont couru sur Windows, nous serions tous morts maintenant.