2009-05-10 5 views
1

Je travaille sur un programme Windows entièrement monothread et qui ne protège aucune structure de données. Cependant, le programme utilise l'API DirectShow qui ouvre son propre message interne, IVideoWindow :: put_Visible par exemple. Ainsi, la fonction de gestion des événements qui appelle IVideoWindow :: put_Visible Method donne à l'autre fonction de gestion des événements la possibilité de détruire ses données.Désactiver l'envoi de messages dans un gestionnaire

Y a-t-il un moyen d'empêcher une telle distribution de messages dans une API?

Répondre

0

La question est un peu obscure pour moi. Parlez-vous d'une API qui entre dans une boucle de message modale en interne? Cela crée-t-il une sorte de problème de ré-entrée pour vous? Si c'est le cas, alors il y a probablement de meilleurs moyens de résoudre votre problème. Si une API entre dans une boucle modale, alors il y a sans doute une bonne raison, et vous devriez le permettre. (Dans votre cas, je suppose que DirectShow communique avec un autre objet COM en interne.) S'il est correctement écrit, une boucle modale enverra toujours des messages aux autres fenêtres sur le même thread.

Dans tous les cas, si vous voulez vraiment faire, voici comment:

PostQuitMessage(0); // Signal quit to force the upcoming loop to exit 
APIFunc(); // Enters modal loop internally 
MSG msg; 
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE); // Eat the next WM_QUIT 

La dernière étape est importante. Lorsqu'une boucle modale se ferme en raison d'un message WM_QUIT, elle doit publier un message d'abandon après sa fermeture (afin que l'application sache qu'elle doit quitter). Si vous ne le mangez pas, votre application sortira.

Questions connexes