Зачем вызывать CoFreeUnusedLibraries () перед OleUninitialize ()? - PullRequest
0 голосов
/ 01 октября 2010

При попытке решить процесс, зависший на CoUninitialize(), я натолкнулся на фрагмент кода, которым поделились многие наши проекты. Когда программа собирается выйти, она сначала вызывает CoFreeUnusedLibraries(), а затем сразу OleUninitialize().

Хотя эффект OleUninitialize() совершенно ясен, я не могу понять, почему кто-то хотел бы позвонить CoFreeUnusedLibraries() перед вызовом OleUnitialize(). Какая польза от этого звонка в этой конкретной точке?

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

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

Предположительно, кто-то, кто написал код, который вызывает DllCanUnloadNow до OleUnitialize, пытался уменьшить рабочий набор и обеспечить очистку.

Я не думаю, что стоит вызывать CoFreeUnusedLibraries прямо перед закрытием приложения (библиотеки все равно будут выгружены).

Мой опыт показывает, что вызов CoFreeUnusedLibraries приводит к сбоям и зависаниям сторонних библиотек COM, которые никогда не тестировали свою реализацию DllCallUnloadNow до выпуска. (Потому что не слишком много приложений вызывают эту функцию).

Вы не предоставили стек вызовов или подсказку о том, где происходило зависание (вы вломились в отладчик, чтобы увидеть, какая DLL находится на вершине стека?). Я предполагаю, что вы, скорее всего, можете отказаться от этого вызова, если не можете исправить нарушающую работу DLL.

0 голосов
/ 01 октября 2010

Документы указывают на то, что

Эта функция предназначена для совместимости с 16-разрядными Windows.

Хммм ...

Вы видели это сообщение о проблеме ?Этот вызов кажется мне избыточным - возможно, это оставляет одну или несколько библиотек DLL в состоянии, когда OleUninitialize не работает должным образом - ожидание некоторого изменения состояния из-за более раннего вызова.Однако это намекает на необходимость подождать некоторое время между вызовами ...

CoFreeUnusedLibraries не сразу освобождает библиотеки DLL, у которых нет активного объекта.Для многопоточных квартир (MTA) и нейтральных квартир (NA) существует десятиминутная задержка.Для однопоточных квартир (STA) отсрочки нет.Десятиминутная задержка для CoFreeUnusedLibraries состоит в том, чтобы избежать многопоточных условий гонки, вызванных выгрузкой DLL компонента.

В других местах также есть комментарии относительно 6-минутного времени ожидания закрытия при использовании DCOM это применимо к вам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...