| Admin | 
| Отправлено: 10.06.2004, 10:53 |  | 
|  
 Владимир
 
 Группа: Администратор
 Сообщений: 1190
 
 
 
  
 | Столкнулся тут с некоторую особенность среды C++Builder: 
 Есть проектная группа(bpg) — exe + dll
 
 По ходу работы:
 
 1 exe динамически загружает dll (LoadLibrary) по нажатию кнопки
 2 dll динамически создает некую форму (через new)
 3 при закрытии этой формы, она уничтожается, и сообщает об этом
 главной форме, что можно выгружать dll
 
 
 | CODE |  | //---------------------------------------------------------------------------
 void __fastcall TFDll::FormClose(TObject *Sender, TCloseAction &Action)
 {
 // pHandle — переданный через параметр в dll
 // Handle формы Form1 из exe
 PostMessage(pHandle, WM_USER+1, NULL, NULL);
 Action = caFree;
 }
 //---------------------------------------------------------------------------
 
 | 
 
 4 Главная форма (из exe) получив сообщение, запускает таймер
 и проверяет — завершилось-ли закрытие/уничтожение dll-формы:
 (isHWND = FindWindow(...)),
 и если да — то выгружает dll (FreeLibrary), освобождая память
 и останавливает таймер.
 
 Так вот — если запустить эту программу из C+++Builder,
 то FindWindow(...) никогда не возвращает NULL,
 соответственно не происходит выгрузка dll и т.д.,
 а запущенная сама по себе, из Windows,
 программа работает правильно.
 
 | 
|  | 
| MDM | 
| Отправлено: 10.06.2004, 11:01 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE (Admin @ 10/06/2004, 11:55) |  | Так вот — если запустить эту программу из C+++Builder, то FindWindow(...) никогда не возвращает NULL,
 соответственно не происходит выгрузка dll и т.д.,
 а запущенная сама по себе, из Windows,
 программа работает правильно.
 | 
 Все правильно, кроме формы в exe + dll есть еще форма в дизайнера созданная средой. Вот она (FindWindow(...)) ее и находит.
 Глюков нет. Builder — надежнее всего!
 | 
|  | 
| olegenty | 
| Отправлено: 10.06.2004, 11:20 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 2412
 
 
 
  
 | Я боролся так: 
 1. В конструкторе формы, либо в обработчике события OnCreate давать форме Caption, отличный от Design Time
 2. Соответственно в FindWindow подставлять этот самый программно присвоенный Caption
 
 
   | 
|  | 
| AVC | 
| Отправлено: 10.06.2004, 12:06 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 1583
 
 
 
  
 | У вас наверное MDI формы. На GDI я с такими проблемами не сталкивался. В качестве идеи — а почему на просматривать Screen->Forms? А правильно работает FindWindow если стартовано более одного приложения? | 
|  | 
| zss | 
| Отправлено: 10.06.2004, 12:38 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 4
 
 
 
  
 | Кстати именно сейчас и пишу что-то подобное  В самом деле я пишу некий плагин к проекту. Работает он так:
 
 1. exe-загружает dll по требованию пользователя.
 2. Dll — создает форму (причем вызывает ее ShowModal())
 
 
 | CODE |  | TForm *DForm = new TForm(0);
 if(!DForm->CreateDiagramm(...)) {
 delete DForm;
 return 0;
 }
 
 DForm->ShowModal();
 delete DForm;
 
 | 
 3. Когда пользователь закрывает форму, она удаляется, а вслед за ней сразу выгружается dll.
 
 Из-за того, что форма ShowModal() — нет необходимости проверять ее закрытие в exe и ожидать окончания работы dll.
 | 
|  | 
| MDM | 
| Отправлено: 10.06.2004, 12:56 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE (olegenty @ 10/06/2004, 12:22) |  | Я боролся так: 
 1. В конструкторе формы, либо в обработчике события OnCreate давать форме Caption, отличный от Design Time
 2. Соответственно в FindWindow подставлять этот самый программно присвоенный Caption
 
 
  | 
 А может просто перекрыть:
 - virtual void __fastcall CreateParams(TCreateParams &Params);
 | 
|  | 
| MDM | 
| Отправлено: 10.06.2004, 13:17 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE (AVC @ 10/06/2004, 13:08) |  | На GDI я с такими проблемами не сталкивался. | 
 И не столкнешься. Еще раз объясняю: две формы — одна дизайнера, другая программы с одним оконным класом напр. TMainForm (на GDI нет форм).
 Запускаешь из-под IDE когда открыта форма в дизайнере FindWindow никогда не даст NULL если открыта ProgectGroup->dll->FormFromDll. Запускаешь из винды ОК. Наверное надо просто закрыть ProgectGroup->dll->FormFromDll, чтоб не маячила на экране.
 
 | 
|  | 
| AVC | 
| Отправлено: 10.06.2004, 13:33 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 1583
 
 
 
  
 | 2MDM это и так понятно. А как на счет 
 | QUOTE |  | А правильно работает FindWindow если стартовано более одного приложения?
 | 
 И вообще вопрос задавал не я.
 | 
|  | 
| MDM | 
| Отправлено: 10.06.2004, 13:56 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE |  | А как на счет. А правильно работает FindWindow если стартовано более одного приложения? | 
 Да вобще-то правильно, но в приведенном вначале темы кода dll не выгрузится. Можно не давать запускаться второй копии exe Я так и делаю для многих программ. Если юзерь забыл, что прога уже запущена и пускает "новую копию" запущенная просто выспывает наверх, а "новая" завершается.
 
 | QUOTE |  | И вообще вопрос задавал не я. | 
 Извини не разобрался.
 | 
|  |