2010-10-01 5 views
0

En essayant de résoudre process hanging on CoUninitialize() je suis tombé sur un morceau de code partagé par beaucoup de nos projets. Quand un programme va quitter, il appelle d'abord CoFreeUnusedLibraries(), puis immédiatement OleUninitialize().Pourquoi appeler CoFreeUnusedLibraries() avant OleUninitialize()?

Alors que l'effet de OleUninitialize() est assez clair, je ne peux pas trouver pourquoi on voudrait appeler CoFreeUnusedLibraries() avant d'appeler OleUnitialize(). Quelle pourrait être l'utilisation de cet appel à ce moment précis?

Répondre

0

Docs indiquent que

Cette fonction est prévue pour la compatibilité avec Windows 16 bits.

Hmmm ...

Avez-vous vu this problem report? Cet appel me semble redondant - peut-être que cela laisse une ou plusieurs DLL dans un état où OleUninitialize ne fonctionne pas correctement - en attendant un changement d'état dû à l'appel précédent. Toutefois, cela ne fait allusion à la nécessité d'attendre un certain temps entre les appels ...

CoFreeUnusedLibraries ne pas libérer immédiatement les DLL qui n'ont pas objet actif. Il y a un délai de 10 minutes pour les appartements multithread (MTA) et les appartements neutres (NAs). Pour les appartements à fil unique (STA), il n'y a pas de délai. Le délai de 10 minutes pour CoFreeUnusedLibraries est de pour éviter les conditions de concurrence multithread causées par le déchargement d'une DLL de composant.

Il y a aussi des commentaires ailleurs qui sont 6 -minute closedown timeout when using DCOM - cela s'applique-t-il à vous?

2

CoFreeUnusedLibraries() déclenche un appel à la DllCanUnloadNow pour chaque processus en COM DLL qui exporte cette fonction. Vous n'êtes pas sûr des problèmes de threading ou des composants COM hors processus en ce qui concerne cette API.

On peut supposer que quelqu'un qui a écrit le code qui appelle DllCanUnloadNow avant OleUnitialize a tenté de réduire le jeu de travail et d'assurer le nettoyage.

Je ne pense pas qu'il y ait beaucoup de valeur à appeler avant droit CoFreeUnusedLibraries arrêt de l'application (les DLL vont se décharger de toute façon). D'après mon expérience, l'appel à CoFreeUnusedLibraries provoque des plantages et des blocages dans des DLL COM tierces dont l'implémentation DllCallUnloadNow n'a jamais été testée avant la publication. (Parce que pas trop d'applications appellent cette fonction).

Vous n'avez pas fourni une pile d'appel ou un indice quant à l'endroit où le blocage se produisait (avez-vous pénétré dans un débogueur pour voir quelle DLL est en haut de la pile?). Ma conjecture est que vous pouvez probablement prendre cet appel si vous ne pouvez pas réparer la DLL fautive.

Questions connexes