Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Закрыть программу из DLL  (Прочитано 13015 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shouldercannon
Помогающий

ru
Offline Offline

« : 17-05-2011 08:50 » 

К моему проекту привязана DLL
Код:
procedure UpdateProgram(URL, Path, UpdateProgramName, ArchiveName: PChar); stdcall; external 'MYDLL.DLL';

Эта DLL скачивает файл из Инета. После того как программа скачала архив нужно завершить работу приложения. Я работаю с DLL в первые.
Код:
procedure TFormUpdate.thrTerminate(Sender: TObject);
begin
  FormUpdate.Close; // Форма, вызванная из DLL не закрывается вообще
  FormMain.PMMExit.Click; // Полнейший бред
end;
...

// FormMain
procedure TFormMain.Exit1Click(Sender: TObject);
begin
  Application.Terminate;
end;

Как закрыть форму, вызванную из DLL и правильно завершить работу программы всё из той же DLL?
Записан
zubr
Гость
« Ответ #1 : 17-05-2011 09:41 » 

А зачем вообще форма и при том в dll для данной задачи?
Записан
Shouldercannon
Помогающий

ru
Offline Offline

« Ответ #2 : 17-05-2011 09:58 » 

На форме прогрессбар, показывающий сколько скачано.
Записан
zubr
Гость
« Ответ #3 : 17-05-2011 11:03 » 

Так а зачем через ж..пу?
Делай основное приложение из формы, а в dll функции закачки. Или вообще в основном приложении и функции закачки, тогда dll вообще не нужна.
Записан
Shouldercannon
Помогающий

ru
Offline Offline

« Ответ #4 : 17-05-2011 11:08 » 

Меня достало дублирование одного и того же кода по сто раз. Хочу его в DLL поместить и оттуда вызывать.
Записан
zubr
Гость
« Ответ #5 : 17-05-2011 11:39 » 

Тогда лучше:
1. Создать VCL-компонент.
2. Не вижу смысла целиком форму сохранять в повторяемый код.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 17-05-2011 17:27 » 

Разве что для модульности полезно - когда в программе десятки-сотни независимых друг от друга модулей и подгружать их нужно по необходимости. Кстати, и обновлять и расширять программу тогда можно отдельными модулями, а не целой программой.

Насчет прогресса - поддерживаю: VCL-компонент. Один раз пишешь, в разных программах используешь.

Если это отдельная форма, то для создания множества форм по одному классу убери в настройках проекта ее из автоматического создания и создавай нужное количество, когда и где тебе надо:
Простейший пример:

Код: (C++)
  TMyForm *frm = new TMyForm(this); // Предполагаю, что создается из другой формы - потому ее объявляю владельцем через this.
  frm->ShowModal();
  delete frm;

Если форма в обработчике Close выполнит

Код: (C++)
  Action = caFree;

то delete не потребуется - объект формы самоуничтожится (и освободит память) после выхода из нее.

Так же легко создаются MDI формы - только их не нужно уничтожать извне - только изнутри.
« Последнее редактирование: 17-05-2011 17:33 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Phodopus
Интересующийся

ru
Offline Offline

« Ответ #7 : 22-05-2011 20:09 » 

А у вас там еще и треды, в этой DLL что ли? Смущает префикс thr...
Записан
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 23-05-2011 09:42 » new

Вам нужно в DLL передавать Application.Handle. Тогда Application.Terminate будет работать.
Код:
procedure UpdateProgram(Handle: THandle; URL, Path, UpdateProgramName, ArchiveName: PChar); stdcall;
begin
    Application.Handle := Handle;
    try
        // ваш код
    finally
        Application.Handle := 0;
    end;
end;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines