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