Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DLL, продолжающая работать, когда процесс, её подгрузивший, закрыт.

1.8K
07 октября 2008 года
Arkady
153 / / 18.12.2007
Столкнулся со следующей проблемой. С одной стороны я знаю, что когда процесс дергает DLL, эта DLL начинает выполняться в адресном пространстве процесса, а не в своем.
При этом я создал маленькую DLL (Active X Library). Добавил в неё Automation Object (потому что когда я добавил COM Object, почему-то Builder не сгенерировал Co-класс и я не мог создать экземпляр объекта).
Добавил в неё бесконечный цикл. Зарегистрировал её.

Дернул её (через Import Type Library) в свой процесс. Попал в бесконечный цикл (при этом мой процесс ждал окончания этого цикла, т.е. была видимость того, что DLL действительно в моем процессе, в основном потоке).
Далее я принудительно завершил _свой_ процесс. А цикл продолжил выполняться.
И сбросить его удалось только принудительно отрубив процесс dllhost из диспетчера задач.

Как такое может быть? Получается DLL крутилась не в моем процессе? Похоже я чего-то важного не понимаю..
6
07 октября 2008 года
George
4.1K / / 05.01.2007
Глянь тут, может поможет:
http://forum.codenet.ru/showthread.php?t=50385
1.8K
07 октября 2008 года
Arkady
153 / / 18.12.2007
Спасибо!
У меня всё в точности, как там, только если я dllhost убиваю, ДЛЛ-ка "отпускается".
Но как и там, хз, почему она не отпускается сама, после завершения приложения =(

Обнаружил, что деструктор моего КОМ-объекта не вызывается в принципе, при закрытии программы...
Хотя указатель на интерфейс объекта объявляется в функции, которая после выполнения заканчивается, соответственно и указатель должен исчезнуть и освободить интерфейс. А тот не освобождается =(

Как мне надоела эта мистика =( Всё-таки Борландовские средства для ActiveX полная лажа, глюк на глюке... вернее недокументированная особенность на особенности..

Если я в своей либе убираю подгрузку ещё одной (делается это в конструкторе её КОМ объекта), то деструктор этого КОМ объекта вызывается (ну какая там связь-то? :( ). Но процесс dllhost висеть продолжает... Просто супер мистика.
1.8K
07 октября 2008 года
Arkady
153 / / 18.12.2007
В итоге я просто в очередной раз начал новый проект, сделал всё по новой, copy-past-ом вставил туда старый код и всё заработало без косяков =( Как всегда.
А пройдет сутки, ничего, вроде бы, не меняешь, а начинает барахлить.

Если у кого есть 10 минут и он считает себя достаточно опытным, я могу выложить барахлящий и небарахлящий проекты, сможете сказать, в чем разница? :) Потому что в моем коде отличий нет, ни Архангельский, ни Энциклопедия программиста Билдера, ни интернет ответов не дают.
14
08 октября 2008 года
Phodopus
3.3K / / 19.06.2008
Так в чем барахлит-то? Что деструктор не вызывается? Если объект "подвисает" в памяти то это неудивительно. А дллхост - штука для оптимизации использования КОМ-объектов в системе, да плюс ДКОМ/КОМ+ функциональность.. MsBlast помните? Через нее вроде в систему лез..
1.8K
08 октября 2008 года
Arkady
153 / / 18.12.2007
Подвисание удалось избежать заменив вызов time() на DateTimeToStr(Now()) в одном месте (всё равно VCL использовалось) и отключив time.h.
И отключив dll (написанную для перегонки кучи чаров имеющих нули в БСТР и обратно (либа ранее много раз использовалась и не барахлила). Потому что заменил её на использование VCL средств.

Видимо где-то там у меня были кривые руки, где именно, так и не понял. Ну и сейчас уже никто не поймет.
Почему dllhost висел (иногда даже если деструктор отрабатывал), или почему time() давала (ИНОГДА!) exception не знаю.
Даже не знаю в принципе, почему такое может быть. Но теперь (слава магии) этого нет.
1
09 октября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Arkady
Подвисание удалось избежать заменив вызов time() на DateTimeToStr(Now()) в одном месте (всё равно VCL использовалось) и отключив time.h.
И отключив dll (написанную для перегонки кучи чаров имеющих нули в БСТР и обратно (либа ранее много раз использовалась и не барахлила). Потому что заменил её на использование VCL средств.

Видимо где-то там у меня были кривые руки, где именно, так и не понял. Ну и сейчас уже никто не поймет.
Почему dllhost висел (иногда даже если деструктор отрабатывал), или почему time() давала (ИНОГДА!) exception не знаю.
Даже не знаю в принципе, почему такое может быть. Но теперь (слава магии) этого нет.


ничего магического в программировании нет. Ошибка скорей всего в вашем подходе. Если для вас актуально разобраться с ошибкой - выложите то что собирались (обя проекта) - я посмотрю завтра. Тем более - не помню что бы в Архангельском подробно рассматривалась эта тема - смысл там искать ответы?

1.8K
09 октября 2008 года
Arkady
153 / / 18.12.2007
Цитата: kot_
ничего магического в программировании нет. Ошибка скорей всего в вашем подходе. Если для вас актуально разобраться с ошибкой - выложите то что собирались (обя проекта) - я посмотрю завтра. Тем более - не помню что бы в Архангельском подробно рассматривалась эта тема - смысл там искать ответы?


Кривые руки и есть магия, это понятно)
Похоже dllhost висело, потому что я забывал делать FreeLibrary вспомогательной dll, которую грузила основная dll. В итоге основная начинала работать в цикле (который содержал в себе MessageBox(...)), я отключал основной процесс средствами Builder (run-program reset), но процесс, видимо, отключен не был (видимо program reset не жестко завершает процесс, а посылает ему команду, которую тот не ловил), потому что MessageBox ждала реакции и потом кидала меня назад. И dllhost ессно продолжала висеть. Как-то так.
Спасибо за помощь, но я уже, не разобравшись в проблеме, решил задачу иным образом и "барахлящий" вариант не сохранился.

1
09 октября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Arkady
Кривые руки и есть магия, это понятно)


кривые руки - есть кривые руки - они может и имеют отношение к магии - но в том смысле что ничего хорошего князь мира сего ничего создать не способен. :)
А на счет почему висело - это надо смотреть код. Строить догадки здесь бесмысленно - почитайте о потоках, СОМ-объектах, что есть апартмент что есть бош - ваша ошибка скорей всего стандартна - не понимание "нах это все я делаю" - ибо "всякое знание несет печаль, и всякое знание умножает скорби"

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог