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

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

Запутался с показом немодальной формы из DLL


Страницы:   1 2 3 4

DmiSb ©   (2006-10-23 11:28:00) 

Никак не пойму, почему при закрытии немодальной формы из динамически загруженной DLL вылетает AV

Код DLL :

library MyLIB;

uses
 SysUtils,
 Classes,
 Windows,
 Forms,
 ibase,
 LIBFormU in 'LIBFormU.pas' {LibF};

procedure LibFormShow(HApp, HForm: THandle); stdcall;
begin
 Application.Handle := HApp;
 if Assigned(LibF) then
   LibF.Show
 else begin
   LibF:=TLibF.Create(Application);
   LibF.CallForm:=HForm;
   LibF.Show;
 end;
end;

procedure LibFormFree; stdcall;
begin
 LibF.Free;
end;

exports LibFormShow;
exports LibFormFree;

begin
end.

Кусок кода основной программы:

 TLibFormShow = procedure(HApp, HForm: THandle); stdcall;
 TLibFormFree = procedure; stdcall;

var HLib: THandle;

procedure TMainF.WMUser(var Msg: TMessage);
var LF: TLibFormFree;
begin
 if HLib > HInstance_Error then begin
   LF := GetProcAddress(HLib, 'LibFormFree');
   if Assigned(LF) then LF;
   FreeLibrary(HLib);
 end;
end;

procedure TMainF.SpeedButton1Click(Sender: TObject);
var LS: TLibFormShow;
begin
 if HLib <= HInstance_Error then
   HLib := LoadLibrary('MyLib.dll');
 if HlLib > HInstance_Error then begin
   LS := GetProcAddress(HLib, 'LibFormShow');
   if Assigned(LS) then LS(Application.Handle, Self.Handle);
 end;
end;


Ketmar   (2006-10-25 18:40:00) [1]

>[64] MetalFan(c) 25-Oct-2006, 18:23
>а что такое CDM?
http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1158621901


MetalFan   (2006-10-25 18:23:00) [2]

а что такое CDM?


Ketmar   (2006-10-25 16:13:00) [3]

>[62] Германн(c) 25-Oct-2006, 16:10
>Ищи в"Потрепаться" про "ламеров второго рода" :-)
угу. а то у меня ещё нет полнотекстового поиска в CDM. %-)


Германн   (2006-10-25 16:10:00) [4]


> А можно ссылку на то, от чего Ketmar задумался?

Ищи в"Потрепаться" про "ламеров второго рода" :-)


Наиль   (2006-10-25 13:52:00) [5]

> Ага-а, значит, прочитал все-таки... и задумался-таки?

А можно ссылку на то, от чего Ketmar задумался?
Хочется тоже преобщится к великому.


Ketmar   (2006-10-25 13:13:00) [6]

>[55] Юрий Зотов(c) 25-Oct-2006, 11:51
>Ага-а, значит, прочитал все-таки... и задумался-таки?
конечно, прочитал. даже осмыслил немного -- в применении к себе. %-)

>Это и есть главное. Понимаешь?
так я ж не к тому, что "бросайте это всё, ведь не оценят и не поймут". вовсе даже наоборот.


DmiSb   (2006-10-25 12:31:00) [7]

С этой статьи
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
я и начал изучение использования пкетов в качестве плагинов, но ......[49],
а ссылка на исходники в статье битая.

Ладно, буду пробовать дальше....
Всем огромное спасибо


Amoeba   (2006-10-25 12:17:00) [8]

Статьи по рассматриваемому вопросу:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468


Сергей М.   (2006-10-25 11:59:00) [9]


> не компилиться


Значит у тебя ошибка в тексте программы.


DmiSb   (2006-10-25 11:54:00) [10]

>[54]
Да я собственно даже на "второго рода" не претендую.
У меня такая задача первая.

>[53]
> procedure GetMyInterface:  IMyInterface; stdcall; // Экспортируется из DLL
> begin
>   Result := TPluginForm.Create(...) as IMyInterface
> end;

Я так понял, этот подход работает в DLL, потому как в BPL "as IMyInterface" не компилиться. И еще мне тут [31], [32] сильно советовали отказаться от форм из DLL. Как тогда этот подход можно использовать из BPL ? Может быть есть какая-нибудь литература по интерфейсам ?


Юрий Зотов   (2006-10-25 11:51:00) [11]

> Ketmar ©   (25.10.06 10:24) [54]

Ага-а, значит, прочитал все-таки... и задумался-таки?

Это есть гуд.
:о)

А насчет "не понимают" - потом поймут. Не скоро. А тогда, когда станут готовы к такому пониманию.

Это и есть главное. Понимаешь?
:о)


Ketmar   (2006-10-25 10:24:00) [12]

>[53] Юрий Зотов(c) 25-Oct-2006, 09:58
offtopic: Юрий, вы решили учить нас личным примером? (это я намекаю на "ламеров второго рода") нам-то вряд ли поможет, но вопрошающим крупно повезло. многие даже не понимают, каким повезло... (без иронии)


Юрий Зотов   (2006-10-25 09:58:00) [13]

> DmiSb   (25.10.06 07:49) [49]

unit MyInterfaces; // Используется EXE и всеми DLL.
type
 IMyInterface = interface
   procedure Method1(...);
   function Method2(...): ...;
   ...
еnd;

unit MyPluginForm; // Используется какой-то DLL
uses
 MyInterfaces;

 TPluginForm = class(TForm, IMyInterface)
 ...
 end;

procedure GetMyInterface:  IMyInterface; stdcall; // Экспортируется из DLL
begin
 Result := TPluginForm.Create(...) as IMyInterface
end;


И это все. Модуль EXE знает, где лежат плагины (DLL или BPL). Он знает, что каждый из них экспортирует функцию GetMyInterface, а та возвращает ссылку на интерфейс IMyInterface. Еще он знает, какие методы этот интерфейс имеет, для чкго они нужны и как их вызывать.

А больше ему и знать ничего не нужно. Его не интересует ни класс, который реализует этот интерфейс (поэтому не требуется никаких RegisterClass), ни способ реализации, ни даже язык, на котором эта DLL написана.

Exe грузит плагин (LoadLibrary), вызывает его функцию GetMyInterface (GetProcAddress), получает ссылку на интерфейс IMyInterface - а далее просто вызывает методы этого интерфейса. Тогда и такие, когда и какие ему нужны. Остальное делает плагин, а КАК он это делает - для Exe неважно.


metalfan   (2006-10-25 09:25:00) [14]


> Методом TFormLoader FindClassByName('.....') класс формы
> определяется достаточно легко, я его только вынес в puplic
> секцию.

кого куда вы вынесли?!


DmiSb   (2006-10-25 09:18:00) [15]

> Что в этом удивительного ?

Получается что ссылка на модуль с формой, которую я хочу хранить в пакете, должна быть в моем приложениии. И я так понимаю форма попадет в приложение, только в виде пакета ? Где же тогда, модульность ?

Или я не правильно понял ?

Сейчас пробую еще один путь, показанный в
http://www.codingclub.net/index.php?go=Articles&in=view&id=183

О форме, которая лежит в .bpl, основное приложение ничего не знает.
Методом TFormLoader FindClassByName('.....') класс формы определяется достаточно легко, я его только вынес в puplic секцию.


Сергей М.   (2006-10-25 08:55:00) [16]


> DmiSb   (25.10.06 07:49) [49]



> Если не делать Register(какой-либо класс),
> функция GetClass(какой-либо класс) выдает nil


Что в этом удивительного ?


DmiSb   (2006-10-25 07:49:00) [17]

>с чего бы это?
> http://delphiworld.narod.ru/base/little_about_plugins.html

Зы.....
У меня кстати не удалось повторить подвиг автора  :-(

Если не делать Register(какой-либо класс),
функция GetClass(какой-либо класс) выдает nil


DmiSb   (2006-10-24 09:46:00) [18]

Да действительно.
И как я на эту статью раньше не наткнулся.
Интересно пообщаться с тем, кто реально использовал эту методику.


metalfan   (2006-10-24 09:11:00) [19]


> DmiSb   (24.10.06 09:06) [46]

с чего бы это?
http://delphiworld.narod.ru/base/little_about_plugins.html


DmiSb   (2006-10-24 09:06:00) [20]

Но тогда пакеты будут грузиться сразу ?


Страницы:   1 2 3 4

Наверх

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