Partager via


Interface IMessageFilter (objidl.h)

Fournit aux serveurs et applications COM la possibilité de gérer de manière sélective les messages COM entrants et sortants en attendant les réponses des appels synchrones. Le filtrage des messages permet de garantir que les appels sont gérés de manière à améliorer les performances et à éviter les interblocages. Les messages COM peuvent être synchrones, asynchrones ou synchronisés en entrée ; la majorité des appels d’interface sont synchrones.

Héritage

L’interface IMessageFilter hérite de l’interface IUnknown. IMessageFilter a également les types de membres suivants :

Méthodes

L’interface IMessageFilter possède ces méthodes.

 
IMessageFilter ::HandleInComingCall

Fournit un point d’entrée unique pour les appels entrants.
IMessageFilter ::MessagePending

Indique qu’un message est arrivé alors que COM attend de répondre à un appel distant.
IMessageFilter ::RetryRe éjectCall

Fournit aux applications la possibilité d’afficher une boîte de dialogue offrant des options de nouvelle tentative, d’annulation ou de changement de tâche.

Remarques

Les appels synchrones nécessitent que l’appelant attende une réponse avant de continuer. COM entre une boucle modale en attendant la réponse. Pendant ce temps, l’appelant est toujours en mesure de recevoir et de distribuer des messages entrants.

Les appels asynchrones permettent à l’appelant de continuer sans attendre une réponse de l’objet appelé. Aujourd’hui, dans COM, les seuls appels asynchrones sont à l’interface IAdviseSink d’un objet. Pendant que l’objet traite un appel asynchrone, il est interdit d’effectuer des appels synchrones vers l’objet appelant.

Pour permettre à des comportements tels que la gestion des focus et le type-ahead de fonctionner correctement, les appels synchronisés en entrée nécessitent que l’objet appelé termine l’appel avant de renoncer au contrôle.

Arrêt de l’application avec WM_QUERYENDSESSION et WM_ENDSESSION

Lorsqu’un utilisateur quitte Windows, chaque application ouverte reçoit un message WM_QUERYENDSESSION suivi d’un message WM_ENDSESSION , à condition que la sortie ne soit pas annulée. Ces messages sont appelés avec la fonction SendMessage , qui limite malheureusement l’initiation de tous les appels LRPC sortants. Il s’agit d’un problème pour les applications conteneur qui ont des objets incorporés ouverts lorsqu’elles reçoivent la demande d’arrêt, car LRPC est nécessaire pour fermer ces objets.

Les applications conteneur et conteneur/serveur avec des documents ouverts affichent généralement une boîte de message à la réception du message WM_QUERYENDSESSION qui demande si l’utilisateur souhaite enregistrer les modifications avant de quitter. Une réponse positive est généralement la valeur par défaut. Pour résoudre la situation décrite ci-dessus, il est recommandé à l’application d’afficher une autre boîte de message demandant si l’utilisateur souhaite ignorer les modifications . une réponse négative doit être la valeur par défaut. Si l’utilisateur choisit d’ignorer les modifications, TRUE doit être retourné pour WM_QUERYENDSESSION, ce qui indique à Windows qu’il peut se terminer. Si l’utilisateur ne souhaite pas ignorer les modifications, FALSE doit être retourné. Aucune tentative de fermeture ou de libération des incorporations en cours d’exécution ne doit être effectuée.

Les applications serveur doivent retourner TRUE pour WM_QUERYENDSESSION sans inviter l’utilisateur. À la réception d’un message WM_ENDSESSION , toutes les applications COM doivent exécuter la séquence de fermeture normale pour les documents et objets de chaque application. En même temps, vous devez ignorer toutes les erreurs résultant d’appels inter-processus ou d’appels à IUnknown ::Release. Tous les pointeurs de stockage (pointeurs d’interface IStorage et IStream ) doivent être libérés pour vider correctement tous les fichiers temporaires gérés par l’implémentation de fichiers composés du stockage structuré.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
Plateforme cible Windows
En-tête objidl.h