![]() |
|
|
![]()
|
|
| s1lver |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Win 7
RAD 2010 Доброго времени суток! Подскажите пожалуйста как можно запустить dll из программы более одного раза? Проблема в том, что после первого запуска (запускается и работает нормально) при попытке вызвать повторно происходит ошибка. Видимо она все еще висит в памяти, если использовать FreeLibrary(DLL) , то она вообще не запускается.
-------------------- Я собрался жить вечно - пока все идет нормально! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Dll дважды не загружаются в память. Можно разве что переименовать файл и загрузить ту же dll с другим именем. Если Dll выгружается, то возможно происходит удаление всех ее ресурсов. По крайней мере секция кода станет недоступной и вызовы функций будут безуспешными. Повторная загрузка это лишний расход памяти, поэтому такую операцию не предусмотрели. Можно конечно сделать хак, загрузить ее в память, найти таблицу реклоков, исправить все релоки, найти таблицу импорта подставить туда правильные адреса функций, найти таблицу экспорта и исправить там все адреса и занести их в свой список (чтобы использовать вместо функции GetProcAddress) . Потом нужно будет вызвать функцию DllMain 2 раза с параметрами загрузка и подключение к экзешнику
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| s1lver |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Дело в том, что в DLL хранится форма, которая должна вызываться не 1 раз пока основная программа работает, т.е после закрытия формы вызванной из DLL она должна быть вызвана еще раз. А сейчас происходит ошибка типа:
И вызвать ее можно снова только перезапустив программу. -------------------- Я собрался жить вечно - пока все идет нормально! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Так при закрытие формы не уничтожает ее, а лишь прячет. Нужно просто показать ее еще раз не выгружая Dll. Т.е. неявным образом вызвать Show. Вообще, прямой вызов функций класса из разных линкованных единиц недопустим в общем случае и может привести к краху программы. Передача указателя this в Dll может привести к непредсказуемым результатам, поскольку правильная реализация класса (расположенная в экзешнике) недоступна в Dll.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| s1lver |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Alexeis
Спасибо, натолкнули на хорошую мысль. Теперь форма запускается больше 1 раза! -------------------- Я собрался жить вечно - пока все идет нормально! |
|||
|
||||
| oldcode |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 8.10.2010 Репутация: 0 Всего: 0 |
есть хорошее правило делиться хорошими мыслями
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |