На этом шаге мы рассмотрим еще один способ загрузки немодальных форм из динамически подключаемых библиотек.
Код, приведенный на предыдущем шаге, получается довольно громоздким: в главном приложении необходимо реализовывать три функции вместо одной. Альтернативный вариант можно предложить, исходя из того, что в DLL имеется объект TApplication, который может поддерживать цикл выборки сообщений. Но в DLL нельзя создать форму, используя метод TApplication.CreateForm, так как вкладка Forms диалогового окна Options (вызывается командой Project | Options) отсутствует в проектах Delphi 4, 5, 6, 7 и недоступна в Delphi 3. Однако все методы объекта TApplication можно вызвать вручную, дописав соответствующий код в DLL:
procedure ShowNMApplication; stdcall; begin if Assigned(Form3) then begin Form3.Show; Exit; end else begin Application.Initialize; Application.CreateForm(TForm3, Form3); Application.Run; Form3.Free; Form3 := nil; end; end;
Следует обратить внимание на то, что в данном проекте дескриптор главного приложения не присваивается дескриптору TApplication в DLL. Это реально приводит к появлению двух кнопок на панели задач. Но в некоторых случаях это полезно - так легче добраться до окон, перекрытых другими окнами. Интересно, что в Delphi 3 после написания данного кода становятся доступными элементы управления вкладки Forms диалогового окна Options, где можно определить автоматически создаваемые формы и главную форму приложения. В более поздних версиях Delphi такая возможность отсутствует.
Код главного приложения, использующий данную библиотеку, выглядит следующим образом:
procedure TForm1.Button1Click(Sender: TObject); var HLib: THandle; ShowApp: TShowApp; begin HLib:=LoadLibrary('FirstLib.dll'); if HLib <> 0 then begin ShowApp := GetProcAddress(HLib, 'ShowNMApplication'); if Assigned(ShowApp) then ShowApp; Application.ProcessMessages; FreeLibrary(HLib); end; end;
В отличие от примера предыдущего шага, динамическая загрузка библиотеки и ее выгрузка осуществляются в одной функции, да и объем написанного кода существенно меньше.
В COM DLL немодальные формы не отображаются, хотя, скорее всего, это можно сделать.
На следующем шаге мы рассмотрим экспорт дочерних форм из DLL.