DLL, продолжающая работать, когда процесс, её подгрузивший, закрыт.
При этом я создал маленькую DLL (Active X Library). Добавил в неё Automation Object (потому что когда я добавил COM Object, почему-то Builder не сгенерировал Co-класс и я не мог создать экземпляр объекта).
Добавил в неё бесконечный цикл. Зарегистрировал её.
Дернул её (через Import Type Library) в свой процесс. Попал в бесконечный цикл (при этом мой процесс ждал окончания этого цикла, т.е. была видимость того, что DLL действительно в моем процессе, в основном потоке).
Далее я принудительно завершил _свой_ процесс. А цикл продолжил выполняться.
И сбросить его удалось только принудительно отрубив процесс dllhost из диспетчера задач.
Как такое может быть? Получается DLL крутилась не в моем процессе? Похоже я чего-то важного не понимаю..
У меня всё в точности, как там, только если я dllhost убиваю, ДЛЛ-ка "отпускается".
Но как и там, хз, почему она не отпускается сама, после завершения приложения =(
Обнаружил, что деструктор моего КОМ-объекта не вызывается в принципе, при закрытии программы...
Хотя указатель на интерфейс объекта объявляется в функции, которая после выполнения заканчивается, соответственно и указатель должен исчезнуть и освободить интерфейс. А тот не освобождается =(
Как мне надоела эта мистика =( Всё-таки Борландовские средства для ActiveX полная лажа, глюк на глюке... вернее недокументированная особенность на особенности..
Если я в своей либе убираю подгрузку ещё одной (делается это в конструкторе её КОМ объекта), то деструктор этого КОМ объекта вызывается (ну какая там связь-то? :( ). Но процесс dllhost висеть продолжает... Просто супер мистика.
А пройдет сутки, ничего, вроде бы, не меняешь, а начинает барахлить.
Если у кого есть 10 минут и он считает себя достаточно опытным, я могу выложить барахлящий и небарахлящий проекты, сможете сказать, в чем разница? :) Потому что в моем коде отличий нет, ни Архангельский, ни Энциклопедия программиста Билдера, ни интернет ответов не дают.
И отключив dll (написанную для перегонки кучи чаров имеющих нули в БСТР и обратно (либа ранее много раз использовалась и не барахлила). Потому что заменил её на использование VCL средств.
Видимо где-то там у меня были кривые руки, где именно, так и не понял. Ну и сейчас уже никто не поймет.
Почему dllhost висел (иногда даже если деструктор отрабатывал), или почему time() давала (ИНОГДА!) exception не знаю.
Даже не знаю в принципе, почему такое может быть. Но теперь (слава магии) этого нет.
И отключив dll (написанную для перегонки кучи чаров имеющих нули в БСТР и обратно (либа ранее много раз использовалась и не барахлила). Потому что заменил её на использование VCL средств.
Видимо где-то там у меня были кривые руки, где именно, так и не понял. Ну и сейчас уже никто не поймет.
Почему dllhost висел (иногда даже если деструктор отрабатывал), или почему time() давала (ИНОГДА!) exception не знаю.
Даже не знаю в принципе, почему такое может быть. Но теперь (слава магии) этого нет.
ничего магического в программировании нет. Ошибка скорей всего в вашем подходе. Если для вас актуально разобраться с ошибкой - выложите то что собирались (обя проекта) - я посмотрю завтра. Тем более - не помню что бы в Архангельском подробно рассматривалась эта тема - смысл там искать ответы?
Кривые руки и есть магия, это понятно)
Похоже dllhost висело, потому что я забывал делать FreeLibrary вспомогательной dll, которую грузила основная dll. В итоге основная начинала работать в цикле (который содержал в себе MessageBox(...)), я отключал основной процесс средствами Builder (run-program reset), но процесс, видимо, отключен не был (видимо program reset не жестко завершает процесс, а посылает ему команду, которую тот не ловил), потому что MessageBox ждала реакции и потом кидала меня назад. И dllhost ессно продолжала висеть. Как-то так.
Спасибо за помощь, но я уже, не разобравшись в проблеме, решил задачу иным образом и "барахлящий" вариант не сохранился.
кривые руки - есть кривые руки - они может и имеют отношение к магии - но в том смысле что ничего хорошего князь мира сего ничего создать не способен. :)
А на счет почему висело - это надо смотреть код. Строить догадки здесь бесмысленно - почитайте о потоках, СОМ-объектах, что есть апартмент что есть бош - ваша ошибка скорей всего стандартна - не понимание "нах это все я делаю" - ибо "всякое знание несет печаль, и всякое знание умножает скорби"