Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Еще раз про немодальную форму из DLL


DmiSb ©   (2005-11-07 15:09:00) 

Уважаемые мастера !!! Понимаю, что уже было много раз, но так и не получается. Если пишу так :

//DLL

procedure Run(App: THandle); export;

...

procedure Run(App: THandle);
begin
 Applet:=NewApplet('');
 Applet.Hide;
 SetParent(Applet.GetWindowHandle, App);
 NewMainF(MainF, Applet);
 MainF.Form.Show;
end;

При закрытии формы, закрывается все приложение
Переделал

 ...
 Applet:=nil;
 MainF.Form.Show;
end;

Теперь при закрытии вываливается ошибка

Из приложения вызываю форму так

TRun=procedure(App: THandle);stdcall;

var FHandle: THandle;
 FRun: TRun;
begin
 FHandle:=0;
 FHandle:=LoadLibrary(PChar(FFileName));
 if FHandle>0 then begin
   FRun:=GetProcAddress(FHandle, 'Run');
   if @FRun<>nil then
     FRun(Applet.Handle);
 end;
end;

И еще никак не соображу куда теперь прилепить FreeLibrary ?

Заранее спасибо


DmiSb   (2005-11-09 12:47:00) [1]

>Интересный эффект получился с минимизацией в главную форму.

Да эффект интересный, но если последовательно минимизировать сначала форму основного приложения, а потом немодальную форму, при восстановлении основной формы, значка свернутой немодальной формы не будет. Тогда наверное проще запретить минимизацию формы основного приложения.


Vladimir Kladov   (2005-11-09 12:21:00) [2]

сюда http://bonanzas.rinet.ru/Demo2NonModalFormsDLL.zip
не так файл называется


Vladimir Kladov   (2005-11-09 12:00:00) [3]

добавил сюда http://bonanzas.rinet.ru/Demo2NonModalForms.zip39K - с изменениями. Интересный эффект получился с минимизацией в главную форму.


DmiSb   (2005-11-09 09:16:00) [4]

2 MTsv DN

Огромное спасибо за пример.
Честно говоря, даже и не подозревал, что через потоки проще.
Я пытался, как в VCL, из DLL посылать сообщения, обратно в приложение. Вроде сообщение обрабатывается, но опять же после FreeLibrary почему-то закрывалось все приложение.

2 Vladimir Kladov
Этот пример обязательно в Демы надо.


MTsv DN   (2005-11-09 08:21:00) [5]

Привет...

Все понял...
Скачай проект: http://www.uus4u.com/download/modules/KOLnMCK/plugins.rar
Я не утверждаю, что это единственно правильное (если вообще правильное решение)... Но это единственное, что пршло в голову "навскидку"...

С Уважением MTsv DN


DmiSb   (2005-11-09 07:21:00) [6]

2 MTsv DN

>пока форму из DLL не закроешь дальше не пойдешь

Форма немодальная - значит я могу создать форму из ДЛЛ и не закрывая её
перейти в основное приложение и запустить всю процедуру второй раз, либо этой же процедурой, изменив только название ДЛЛ, создать форму из другой ДЛЛ. До FreeLibrary(FHandle); я при этом не дохожу.
А вот теперь собственно вопрос, как корректно выгрузить ДЛЛ, если я не буду это делать в вышеописанной процедуре ?


MTsv DN   (2005-11-08 14:54:00) [7]

Если честно, вопроса не понял... :(
Поэтому повторюсь...
procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar(FULL_DLL_PATH)); // Здесь загружается твоя DLL
if FHandle <> 0 then                                       // Проверка успешного открытия
 begin
  RunForm := GetProcAddress(FHandle, 'RunForm'); // Получаешь адрес процедуры
  if @RunForm <> nil then                                   // Проверка
   RunForm(Applet.Handle);                                 // Запуск процедуры созданияформы, пока форму из DLL не закроешь дальше не пойдешь
  FreeLibrary(FHandle);                                     // закрытие библиотеки
 end;
end;

В чем вопрос-то?..

С Уважением MTsv DN


DmiSb   (2005-11-08 13:50:00) [8]

Решил побеспокоить еще раз.
Если из приложения одной и той же процедурой, загружаются формы из разных ДЛЛ, типа

procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar('run_')); //здесь меняем имя ДЛЛ
....

то, сразу делать

 if FHandle <> 0 then
   FreeLibrary(FHandle);

как-то не хорошо, так как FHandle может быть от другой ДЛЛ .

Как в этом случае передать в приложение, что я закрыл какую-либо форму в ДЛЛ, чтобы выгрузить именно эту ДЛЛ ?
То есть получается, как приложение с плагинами.

Заранее спасибо.


DmiSb   (2005-11-08 11:00:00) [9]

2 Vladimir Kladov
 
Да, демо посмотрел очень внимательно, но там пример для модальной формы, а мне нужна именно немодальная. Хорошо бы положить для начинающих и такой пример.

2 MTsv DN

Спасибо за помощь.
Действительно вся загвоздка оказалась, в неправильном показе формы , а именно вместо  
 MainF.Form.Show;
надо делать
 Run(MainF.Form);


MTsv DN   (2005-11-08 09:24:00) [10]

P.S.
Опечатка:   FHandle := LoadLibrary(PChar('run_'))--> FHandle := LoadLibrary(PChar(' Run_Form'))

С Уважением MTsv DN


MTsv DN   (2005-11-08 09:22:00) [11]

Привет...

Вот код DLL:
library Run_Form;
uses Kol, Windows, Messages;

procedure RunForm(App: THandle);
var
MainF : PControl;
begin
Applet:=NewApplet('');
SetParent(Applet.GetWindowHandle, App);
MainF := NewForm(Applet, 'Run_');
Run(MainF);
end;

exports
 RunForm name 'RunForm';

begin
end.


А вот код вызова формы:
procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar('run_'));
if FHandle>0 then begin
  RunForm := GetProcAddress(FHandle, 'RunForm');
  if @RunForm <> nil then
    RunForm(Applet.Handle);
end;
if FHandle <> 0 then
 FreeLibrary(FHandle);
end;


Думаю проблем быть не должно... Использую: KOLnMCK 2.21 + Delphi 7 + Windows XP SP2...

С Уважением MTsv DN


Vladimir Kladov   (2005-11-08 09:21:00) [12]

а демо смотрели?


DmiSb   (2005-11-08 08:17:00) [13]

И-та-а-а-к ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо