Информация об изменениях

Сообщение Re: Запрет выгрузки dll до момента освобождения последнего о от 26.10.2018 18:41

Изменено 26.10.2018 18:44 Alexander G

Re: Запрет выгрузки dll до момента освобождения последнего объекта из dll
Здравствуйте, Aniskin, Вы писали:

A>Что бы изучить получше оконную систему Windows решил я написать более-менее сложный контрол на чистом WinApi. Для одного из проектов мне нужно было дерево, отображающее себя несколько иначе по сравнению со стандартным SysTreeView32, его и решил реализовать. Контрол я успешно написал, оформил по взрослому, но осталась у меня одна не решенная проблема.


Я не думал, что такое кто-то делает в 2018.

A>Проблема возникает при завершении хост приложения. Хост приложение ничего не знает о том, что были запросы WM_GETOBJECT и есть живые объекты из dll, и может выгрузить dll, а лишь затем вызвать OleUninitialize. Соответственно при OleUninitialize, когда вызывается последний Release объекта, происходит AV.


A>Вопрос – как то можно это исправить в самой dll?


Может хранить референс на DLL в объекте?

GetModuleHandleEx со своим адресом с GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS и без GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS для AddRef
FreeLibrary для Release
Re: Запрет выгрузки dll до момента освобождения последнего о
Здравствуйте, Aniskin, Вы писали:

A>Что бы изучить получше оконную систему Windows решил я написать более-менее сложный контрол на чистом WinApi. Для одного из проектов мне нужно было дерево, отображающее себя несколько иначе по сравнению со стандартным SysTreeView32, его и решил реализовать. Контрол я успешно написал, оформил по взрослому, но осталась у меня одна не решенная проблема.


Я не думал, что такое кто-то делает в 2018.

A>Проблема возникает при завершении хост приложения. Хост приложение ничего не знает о том, что были запросы WM_GETOBJECT и есть живые объекты из dll, и может выгрузить dll, а лишь затем вызвать OleUninitialize. Соответственно при OleUninitialize, когда вызывается последний Release объекта, происходит AV.


A>Вопрос – как то можно это исправить в самой dll?


Может хранить референс на DLL в объекте?

GetModuleHandleEx со своим адресом с GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS и без GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT для первого AddRef
FreeLibrary для последнего Release