COM автоматически выгружает библиотеки DLL, когда больше нет ссылок на объекты? - PullRequest
4 голосов
/ 08 марта 2010

Например, на языке X:

let x = CreateOject( "MyProgID" )
x.LateBoundCall()
x.Release()  // (or setting x to Nothing in VB-like language, etc)

Что происходит с библиотекой DLL MyProgID? COM выгружает DLL автоматически?

EDIT

Предполагается, что приведенный выше код находится в исполняемом файле, который не представляет COM.

Ответы [ 2 ]

10 голосов
/ 08 марта 2010

Да, но не детерминированным способом. Windows периодически спрашивает каждую загруженную DLL: « безопасно ли вам сейчас выгружать ?» Любая DLL, которая отвечает "Да", выгружается.

Примечание замечание от MSDN :

Если DLL загружена через вызов CoGetClassObject не может экспортировать DllCanUnloadNow, DLL не будет выгружается до вызова приложения функция CoUninitialize для освобождения библиотеки OLE.

См. Старая новая вещь статья.

2 голосов
/ 08 марта 2010

Вы должны вручную высвободить ресурсы, используемые COM-объектами. они используют счетчик ссылок внутри, чтобы сохранить количество ссылок на компонент. если компонент все еще имеет refcounter> 0, тогда dll не будет выгружен и ресурсы не будут освобождены.

...