Здравствуйте 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 к этой функции есть подробное описание тонкостей использования задержки.
Есть COM-объект. В клиентской программе работаем с ним — естественно грузится DLL, в которой этот объект находится. Освобождаем объект (счетчик ссылок=0), по идее DLL должна выгрузиться из памяти. Но в действительности этого не происходит. Почему? В умных книжках и документации сказано, что выгрузкой DLL занимается менеджер (SCM). Но как-то получается что менеджер этот выгружает DLL только после выполнения функции CoUnitialize.
Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?
Еще раз повторяю — счетчик ссылок равен нулю — DLL готова к тому, чтоб ее выгрузили.
Здравствуйте econt, Вы писали:
E>Есть COM-объект. В клиентской программе работаем с ним — естественно грузится DLL, в которой этот объект находится. Освобождаем объект (счетчик ссылок=0), по идее DLL должна выгрузиться из памяти. Но в действительности этого не происходит. Почему? В умных книжках и документации сказано, что выгрузкой DLL занимается менеджер (SCM). Но как-то получается что менеджер этот выгружает DLL только после выполнения функции CoUnitialize. E>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие? E>Еще раз повторяю — счетчик ссылок равен нулю — DLL готова к тому, чтоб ее выгрузили.
Здравствуйте econt, Вы писали:
E>Есть COM-объект. В клиентской программе работаем с ним — естественно грузится DLL, в которой этот объект находится. Освобождаем объект (счетчик ссылок=0), по идее DLL должна выгрузиться из памяти. Но в действительности этого не происходит. Почему? В умных книжках и документации сказано, что выгрузкой DLL занимается менеджер (SCM). Но как-то получается что менеджер этот выгружает DLL только после выполнения функции CoUnitialize.
Еще есть CoFreeUnusedLibraries — впрочем, она не всегда выгружает DLL сразу. E>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие?
Для начала вызов функции DllCanUnloadNow из твоей библиотеки должен вернуть S_OK. Про твой счетчик ссылок SCM ничего не знает. E>Еще раз повторяю — счетчик ссылок равен нулю — DLL готова к тому, чтоб ее выгрузили.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S> Еще есть CoFreeUnusedLibraries — впрочем, она не всегда выгружает DLL сразу.
Я так и знал, что мне сейчас начнут рассказывать об этой функции, но дело в том, что используя эту функцию, Я САМ заставляю менеджер выгрузить DLLs. А я не хочу делать его работу. Я хочу, чтоб он сам догадался, что мою DLL пора выгружать. Я могу, конечно, по таймеру, скажем раз в минуту запускать эту функцию, но тогда получается, что я сам — менеджер, а SCM — непонятно что.
E>>Хотелось бы узнать, как менеджер решает, что такую-то DLL нужно выгрузить? Что должно произойти, чтоб он надумал выполнить это действие? S>Для начала вызов функции DllCanUnloadNow из твоей библиотеки должен вернуть S_OK. Про твой счетчик ссылок SCM ничего не знает.
Да... В следующий раз я попытаюсь так задать вопрос, чтоб никаких сомнений у вас не оставалось, что я все сделал правильно. Функция DllCanUnloadNow возвращает S_OK, как и положено для того, чтоб сообщить менеджеру, что пора делать выгрузку. Я думал, что по моему вопросу это было понятно...