6
votes

Est-ce que getMessage () retour -1 dans la boucle de message principal?

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);
}


0 commentaires

4 Réponses :


4
votes

Vous devez suivre les règles spécifiées dans la documentation MSDN pour getMessage () . 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.

L'équipe Visual Studio est séparée de l'équipe Windows et il s'agit des mêmes erreurs que tout le monde!

i réalité, je ne peux jamais imaginer getMessage () 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.


1 commentaires

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.



3
votes

La documentation que vous mentionnez dit:

S'il y a une erreur, la valeur de retour est -1. Par exemple, la fonction échoue si hwnd est une poignée de fenêtre non valide ou lpmsg est un pointeur non valide.

Dans votre deuxième exemple, ces deux cas sont couverts: msg est une structure typique de la pile-pile, donc & msg sera toujours un pointeur valide. NULL est transmis dans le paramètre hwnd et est une valeur acceptée pour ce paramètre. wmsgfiltermin et wmsgfiltermax est à la fois zéro, qui est également une combinaison valide.

SO getMessage () ne échoue pas lors de la validation des paramètres. La documentation ne mentionne pas clairement si elle renvoie également -1 dans d'autres situations (mémoire épuisée, par exemple). Cela dit, j'ai appelé getMessage () de la même manière que votre deuxième exemple depuis un moment et je n'ai jamais vu retourner -1 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.


1 commentaires

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.



3
votes

é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 .

Il est possible qu'une future version de getMessage sera 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 que tant de programmes s'appuient sur.

Et malgré tout cela, vous devriez toujours suivre la documentation.


2 commentaires

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 * -Argument. Si vous lisez la documentation pour getMessage Il nomme explicitement ces 2 modes d'erreur. Plus bas où il lit "Évitez le code comme celui-ci:" Il montre un exemple avec un filtre hwnd . 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.



3
votes

My Gut (aka Raymond Chen Puissances psychiques) Me dit que getMessage (& msg, null, 0, 0) 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.

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.


1 commentaires

Si les centrales nucléaires ont couru sur Windows, nous serions tous morts maintenant.