2009-08-20 6 views
0

MSDN article sur CoRevokeGetClassObject() indique que lorsque le serveur COM l'appelle, l'objet de classe référencé par les clients n'est pas libéré. Puis le suivant vient:Quel est le bénéfice de l'article MSDN sur CoRevokeClassObject?

Si d'autres clients ont encore des pointeurs vers l'objet de classe et ont fait la référence> compte à incrémenter par des appels à IUnknown :: AddRef, le compte de référence ne sera pas> zéro. Lorsque cela se produit, les applications peuvent bénéficier si les appels suivants (avec les> exceptions évidentes de IUnknown :: AddRef et IUnknown :: Release) à l'objet de classe échouent.

Qu'entend-on par "applications may benefit"? L'objet de classe n'est pas libéré, mais les demandes de création échouent. Cela semble raisonnable, mais où est le bénéfice?

Répondre

0

Ouais, c'est un tour assez étrange de mots ...

Je pense que ce qu'ils essaient de dire est que les clients peuvent se retrouver dans une situation délicate si elles créent des objets à partir d'un serveur qui vient d'appeler CoRevokeClassObjects , car il est probable que ça va disparaître très bientôt (CoRevokeClassObjects est régulièrement appelé lorsqu'un serveur est arrêté.)

Ainsi, si les appels d'activation (IClassFactory::CreateInstance) ne manquent pas, le client obtiendra un pointeur d'interface arrière, et dès qu'ils appellent une méthode dessus, ils recevront une erreur de la couche RPC que le serveur est parti.

Je suppose que ce « bénéfique » en quelque sorte :-)

Cela dit, je ne suis pas sûr de savoir comment détecter le cas où IUnknown::Release est appelé par CoRevokeClassObjects vs un autre client, mais je suppose que la révocation de code les usines peuvent définir un état global ou par état d'usine qu'elles peuvent vérifier avant de laisser passer les demandes de création.

Questions connexes