Когда выгружается DLL?
От: econt Украина http://cprime.110mb.com
Дата: 28.12.01 11:48
Оценка:
Есть COM-объект. В клиентской программе работаем с ним — естественно грузится DLL, в которой этот объект находится. Освобождаем объект (счетчик ссылок=0), по идее DLL должна выгрузиться из памяти. Но в действительности этого не происходит. Почему? В умных книжках и документации сказано, что выгрузкой DLL занимается менеджер (SCM). Но как-то получается что менеджер этот выгружает DLL только после выполнения функции CoUnitialize.
Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?
Еще раз повторяю — счетчик ссылок равен нулю — DLL готова к тому, чтоб ее выгрузили.
Мне никогда не нравилась MFC. (c) Charles Petzold
Re: Когда выгружается DLL?
От: Willi  
Дата: 28.12.01 11:53
Оценка:
Здравствуйте econt, Вы писали:

E>Есть COM-объект. В клиентской программе работаем с ним — естественно грузится DLL, в которой этот объект находится. Освобождаем объект (счетчик ссылок=0), по идее DLL должна выгрузиться из памяти. Но в действительности этого не происходит. Почему? В умных книжках и документации сказано, что выгрузкой DLL занимается менеджер (SCM). Но как-то получается что менеджер этот выгружает DLL только после выполнения функции CoUnitialize.

E>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?
E>Еще раз повторяю — счетчик ссылок равен нулю — DLL готова к тому, чтоб ее выгрузили.

Посмотри описание CoFreeUnusedLibraries
\/\/i||i
Re: Когда выгружается DLL?
От: Sergey Россия  
Дата: 28.12.01 11:56
Оценка:
Здравствуйте econt, Вы писали:

E>Есть COM-объект. В клиентской программе работаем с ним — естественно грузится DLL, в которой этот объект находится. Освобождаем объект (счетчик ссылок=0), по идее DLL должна выгрузиться из памяти. Но в действительности этого не происходит. Почему? В умных книжках и документации сказано, что выгрузкой DLL занимается менеджер (SCM). Но как-то получается что менеджер этот выгружает DLL только после выполнения функции CoUnitialize.

Еще есть CoFreeUnusedLibraries — впрочем, она не всегда выгружает DLL сразу.
E>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?
Для начала вызов функции DllCanUnloadNow из твоей библиотеки должен вернуть S_OK. Про твой счетчик ссылок SCM ничего не знает.
E>Еще раз повторяю — счетчик ссылок равен нулю — DLL готова к тому, чтоб ее выгрузили.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Когда выгружается DLL?
От: econt Украина http://cprime.110mb.com
Дата: 28.12.01 12:17
Оценка:
Здравствуйте Sergey, Вы писали:

S> Еще есть CoFreeUnusedLibraries — впрочем, она не всегда выгружает DLL сразу.

Я так и знал, что мне сейчас начнут рассказывать об этой функции, но дело в том, что используя эту функцию, Я САМ заставляю менеджер выгрузить DLLs. А я не хочу делать его работу. Я хочу, чтоб он сам догадался, что мою DLL пора выгружать. Я могу, конечно, по таймеру, скажем раз в минуту запускать эту функцию, но тогда получается, что я сам — менеджер, а SCM — непонятно что.

E>>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?

S>Для начала вызов функции DllCanUnloadNow из твоей библиотеки должен вернуть S_OK. Про твой счетчик ссылок SCM ничего не знает.
Да... В следующий раз я попытаюсь так задать вопрос, чтоб никаких сомнений у вас не оставалось, что я все сделал правильно. Функция DllCanUnloadNow возвращает S_OK, как и положено для того, чтоб сообщить менеджеру, что пора делать выгрузку. Я думал, что по моему вопросу это было понятно...
Мне никогда не нравилась MFC. (c) Charles Petzold
Re[3]: Когда выгружается DLL?
От: Willi  
Дата: 28.12.01 16:09
Оценка: 4 (1)
Здравствуйте econt, Вы писали:

E>Здравствуйте Sergey, Вы писали:


S>> Еще есть CoFreeUnusedLibraries — впрочем, она не всегда выгружает DLL сразу.

E>Я так и знал, что мне сейчас начнут рассказывать об этой функции, но дело в том, что используя эту функцию, Я САМ заставляю менеджер выгрузить DLLs. А я не хочу делать его работу. Я хочу, чтоб он сам догадался, что мою DLL пора выгружать. Я могу, конечно, по таймеру, скажем раз в минуту запускать эту функцию, но тогда получается, что я сам — менеджер, а SCM — непонятно что.

E>>>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?

S>>Для начала вызов функции DllCanUnloadNow из твоей библиотеки должен вернуть S_OK. Про твой счетчик ссылок SCM ничего не знает.
E>Да... В следующий раз я попытаюсь так задать вопрос, чтоб никаких сомнений у вас не оставалось, что я все сделал правильно. Функция DllCanUnloadNow возвращает S_OK, как и положено для того, чтоб сообщить менеджеру, что пора делать выгрузку. Я думал, что по моему вопросу это было понятно...

И чего Вы так нервничаете, молой человек.

В писании сказано:

Applications can call CoFreeUnusedLibraries periodically to free resources. It is most efficient to call it either at the top of a message loop or in some idle-time task.

т.е. приложение само должно вызывать эту функцию.

Есть еще CoFreeUnusedLibrariesEx, в нее можно передавать время задержки до отгрузки.
В секции Remarks к этой функции есть подробное описание тонкостей использования задержки.
\/\/i||i
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.