Здравствуйте, Хитрик Денис, Вы писали:
КД>>Это все мелочи — главная жопа с проводником в том что внутри него нельзя по-человечески использовать CoCreateInstace для создания других COM-объектов из DLL (до NT4 — точно). Вот. Но это тоже решаемо
ХД>Хм... не уверен, что мне это всё пригодится, но можно ли чуть подробнее? Общее направление
На сколько я помню выводы из своих "исследований", проводник не инициализирует COM внутри своих потоков и для создания компонент и использует свой альтернативный(?) механизм. Вообщем, в конечном итоге я написал свой "менеждер" COM-объектов из DLL, который управляет DLL-ями. И все начало работать без всяких труднообъяснимых проблем.
Так что если вдруг твоя программа начнет расти — лучше сразу обрати на это внимание.
Принцип работы этого менеджера достаточно тривиальный:
При первом запросе на создание COM-объекта, запускается поток, который блокирует DLL с самим менеджером в памяти (то есть просит систему загрузить эту DLL еще раз)
Фоновый поток переодически опрашивает DllCanUnloadNow загруженных DLL c объектами и выгружает те, которые уже не используются
Когда в течении определенного времени менеджер бездействует (то есть не обслуживает DLL-и с объектами), фоновый поток вызывает FreeLibraryAndExitThread. Если фоновый поток — последний пользователь DLL с менеджером, то она выгружается.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --