Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запуск Dll из программы более 1 раза 
V
    Опции темы
s1lver
  Дата 30.10.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Win 7
RAD 2010

Доброго времени суток!

Подскажите пожалуйста как можно запустить dll из программы более одного раза? Проблема в том, что после первого запуска (запускается и работает нормально) при попытке вызвать повторно происходит ошибка. Видимо она все еще висит в памяти, если использовать FreeLibrary(DLL) , то она вообще не запускается.  smile 

Код

if (HINSTANCE DLLInstance = LoadLibrary("cab.dll"))
  {
     typedef TForm* (__cdecl* TCreateMyForm)(TForm*);
     if( TCreateMyForm CreateMyForm = (TCreateMyForm)GetProcAddress(DLLInstance,"_CreateMyForm"))
      {
      TForm* form = CreateMyForm(this); form->Show();

      }
  } else ShowMessage("Не могу найти DLL!");
  



--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
Alexeis
Дата 30.10.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Dll дважды не загружаются в память. Можно разве что переименовать файл и загрузить ту же dll с другим именем. Если Dll выгружается, то возможно происходит удаление всех ее ресурсов. По крайней мере секция кода станет недоступной и вызовы функций будут безуспешными. Повторная загрузка это лишний расход памяти, поэтому такую операцию не предусмотрели. Можно конечно сделать хак, загрузить ее в память, найти таблицу реклоков, исправить все релоки, найти таблицу импорта подставить туда правильные адреса функций, найти таблицу экспорта и исправить там все адреса и занести их в свой список (чтобы использовать вместо функции GetProcAddress) . Потом нужно будет вызвать функцию DllMain 2 раза с параметрами загрузка и подключение к экзешнику smile . Думаю что все таки проще написать так чтобы не нужно было грузить 2 раза smile . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
s1lver
Дата 30.10.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Дело в том, что в DLL хранится форма, которая должна вызываться не 1 раз пока основная программа работает, т.е после закрытия формы вызванной из DLL она должна быть вызвана еще раз. А сейчас происходит ошибка типа:
Цитата

Access violation at address 0044D1B2 in module 'project.exe'. Read of addres 8B5B5E23.


И вызвать ее можно снова только перезапустив программу.  smile 


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
Alexeis
Дата 30.10.2010, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Так при закрытие формы не уничтожает ее, а лишь прячет. Нужно просто показать ее еще раз не выгружая Dll. Т.е. неявным образом вызвать Show. Вообще, прямой вызов функций класса из разных линкованных единиц недопустим в общем случае и может привести к краху программы. Передача указателя this в Dll может привести к непредсказуемым результатам, поскольку правильная реализация класса (расположенная в экзешнике) недоступна в Dll.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
s1lver
Дата 31.10.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



Alexeis

Спасибо, натолкнули на хорошую мысль. Теперь форма запускается больше 1 раза!  smile 


 smile  


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
oldcode
Дата 31.10.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 8.10.2010

Репутация: 0
Всего: 0



есть хорошее правило делиться хорошими мыслями smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.