2010-05-25 3 views
2

Un pointeur COM non libéré vers un processus externe (toujours actif) peut-il bloquer ce processus en cas de destruction?COM Pointeurs et terminaison de processus

Même avec TerminateProcess appelé? Le processus A a une référence de pointeur d'interface COM au processus B, maintenant le processus B émet un TerminateProcess sur A, si un pointeur d'interface COM au processus B du processus A n'est pas libéré correctement, est-ce que le processus se bloque à la fin ?

Je veux savoir que j'ai un projet où un processus enfant se bloque lors de la destruction, même si TerminateProcess est appelé si la procédure de fermeture normale échoue. Quand il se bloque, il ne se bloque pas seulement, mais aussi son processus parent, ce qui est désastreux car il s'exécute dans un environnement de production. J'essaie donc de voir où il y a des possibilités que ça se passe mal.

Répondre

3

Non. TerminateProcess fait exactement cela - détruit complètement le processus. Raymond Chen a quelques mots à dire à ce sujet ....

EDIT: Il a aussi quelques détails more detailed articlesexactement comment se produit l'arrêt du processus. Il n'est cependant pas lié à TerminateProcess.

2

Eh bien, oui, il est techniquement possible pour TerminateProcess de ne pas terminer le processus. Si un thread du noyau exécute une requête d'E/S qui ne se termine jamais, le processus ne peut pas quitter. Facile à diagnostiquer, vous verrez le processus dans l'onglet Processus de Taskmgr.exe avec un nombre de handles de un. Vista a eu une amélioration de CancelIo pour résoudre ce problème, je pense que Raymond en a parlé aussi.

Ce qui est seulement très associé à COM. Saisir les pailles: un serveur COM hors processus ne gère pas bien TerminateProcess d'un client, Windows ne peut pas appeler automatiquement Release() sur les pointeurs d'interface. Il va continuer à courir pour toujours. Jusqu'à ce que quelqu'un appelle TerminateProcess, généralement le code d'arrêt de Windows ou TaskMgr.exe

Assurez-vous de modifier votre question et expliquez pourquoi vous l'avez même demandé.

+0

1: Mais le serveur COM hors processus meurt si 'TerminateProcess' est appelé, même si les processus ont toujours des références ouvertes. 2: +1 pour le commentaire "modifier votre question". –

+0

Le serveur COM ne sera pas exécuté pour toujours si un client meurt. Il sera arrêté après un délai d'attente spécifique. –