Arhn - архитектура программирования

Зачем вызывать CoFreeUnusedLibraries() перед OleUninitialize()?

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

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


Ответы:


1

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

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

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

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

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

02.10.2010

2

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

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

Хм...

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

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

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

01.10.2010
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..