CoFreeUnusedLibraries() инициирует вызов DllCanUnloadNow для каждой внутрипроцессной DLL-библиотеки COM, которая экспортирует эту функцию. Не уверен насчет проблем с потоками или внепроцессных COM-компонентов, связанных с этим API.
Предположительно, кто-то, написавший код, вызывающий DllCanUnloadNow до OleUnitialize, пытался уменьшить рабочий набор и обеспечить очистку.
Я не думаю, что вызов CoFreeUnusedLibraries непосредственно перед завершением работы приложения имеет большое значение (библиотеки DLL все равно будут выгружены).
По моему опыту, вызов CoFreeUnusedLibraries приводит к сбоям и зависаниям сторонних COM-библиотек DLL, реализация которых DllCallUnloadNow никогда не тестировалась перед выпуском. (Потому что не так уж много приложений вызывают эту функцию).
Вы не предоставили стек вызовов или подсказку о том, где происходит зависание (вы взломали отладчик, чтобы увидеть, какая DLL находится наверху стека?). Я предполагаю, что вы, вероятно, сможете отказаться от этого вызова, если не сможете исправить неисправную DLL.
02.10.2010