Re: Запрет выгрузки dll до момента освобождения последнего объекта из dll
От: bnk СССР http://unmanagedvisio.com/
Дата: 25.10.18 21:16
Оценка:
Здравствуйте, Aniskin, Вы писали:

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


A>Приличный контрол должен уметь UI Automation. Его я тоже реализовал. Но возникло одно но. Сам контрол реализован в dll (для использования в проекте на любом языке). Когда какое-нибудь приложение типа Narrator желает поработать с моим контролом через UI Automation, то в контрол начинают посылаться сообщения WM_GETOBJECT (OBJID_CLIENT), в ответ на которое я возвращаю экземпляр объекта, реализующего IAccessible. И как бы все работает, Narrator видит отдельные ноды дерева, произносит человеческим голосом текст ноды, и т.д. Проблема возникает при завершении хост приложения. Хост приложение ничего не знает о том, что были запросы WM_GETOBJECT и есть живые объекты из dll, и может выгрузить dll, а лишь затем вызвать OleUninitialize. Соответственно при OleUninitialize, когда вызывается последний Release объекта, происходит AV.


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


Так не должно быть. Похоже на какой-то косяк при подсчете ссылок (как именно ты реализовал WM_GETOBJECT/IAccessible)
Когда система хочет выгрузить DLL, она ее предварительно спрашивает, "можно ли"? (DllCanUnloadNow)?
Твоя DLL похоже отвечает "да, можно", хотя у нее есть живые объекты.

К сожалению, я в Delphi не в зуб ногой, как починить, посоветовать не смогу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.