Недавно я столкнулся с проблемой с объектом COM
, который использовал фабрику синглтон-классов и имел члены, которые были указателями на другие COM-объекты, реализованные в другой DLL, чем объект-одиночка.
Эти другие COM-объекты были созданы одноэлементным объектом, и это была единственная ссылка на них.
Поскольку одноэлементный объект никогда не уничтожается до тех пор, пока его модуль не выгружен, то, по-видимому, происходит то, что иногда в этот момент DLL, в которой были реализованы другие COM-объекты (члены синглтона), уже выгружалась, и в этом случае произойдет сбой, когда синглтон выпустит свои ссылки на эти объекты в своем деструкторе.
DLL, реализующая другие COM-объекты, знает, что имеются ссылки на объекты, и возвращает S_FALSE
из метода DllCanUnloadNow
.
Однако, похоже, это не мешает выгружать DLL всегда.
Существует ли какой-либо безопасный способ сохранить указатели на COM-объекты из другой библиотеки DLL в одиночном COM-объекте?