Шаг 314.
Создание внутрипроцессных серверов автоматизации. Создание и использование DLL. Немодальные формы в DLL (окончание)

    На этом шаге мы рассмотрим еще один способ загрузки немодальных форм из динамически подключаемых библиотек.

    Код, приведенный на предыдущем шаге, получается довольно громоздким: в главном приложении необходимо реализовывать три функции вместо одной. Альтернативный вариант можно предложить, исходя из того, что в 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;
Текст этого приложения вместе с DLL можно взять здесь (441,0 Кб).

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

    В COM DLL немодальные формы не отображаются, хотя, скорее всего, это можно сделать.

    На следующем шаге мы рассмотрим экспорт дочерних форм из DLL.




Предыдущий шаг Содержание Следующий шаг