Шаг 226.
Создание пользовательской динамической библиотеки

    На этом шаге мы рассмотрим алгоритм создания DLL.

    Для создания динамической библиотеки DLL используем команду File | New | Other... главного меню Delphi, в результате выполнения которой откроется диалоговое окно выбора типа создаваемого объекта (рис. 1).


Рис.1. Выбор типа создаваемого объекта

    В этом окне на вкладке New выбираем вариант DLL Wizard, после чего будет создан новый проект. Созданный проект состоит из одного файла, в котором есть заголовок, секция подключаемых и используемых модулей, а также секция, содержащая операторы, выполняемые во время загрузки библиотеки (рис. 2).


Рис.2. Содержимое файла проекта динамической библиотеки

    Очевидно, что созданный проект пока не содержит ни одной функции или процедуры. Преобразуем исходный текст и заголовок этого проекта и добавим в него наши функции для работы с MS Word, созданные ранее.

    Приведем полный текст библиотеки, сохраненной под именем dserver.

library dserver;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  MSWORD;

{$R *.res}

Function FindAllAndPasteTextDoc(document:variant;
             findtext,pastetext:string):boolean;export;
const wdReplaceAll=2;
      wdFindContinue=1;
begin
  FindAllAndPasteTextDoc:=false;
  try
    document.Parent.Selection.Find.Forward:=true;
    document.Parent.Selection.Find.Text:= findtext;
    document.Parent.Selection.Find.Replacement.Text:=pastetext;
    document.Parent.Selection.Find.Wrap:=wdFindContinue;
    if document.Parent.Selection.
         Find.Execute(Replace:=wdReplaceAll)then
                  FindAllAndPasteTextDoc:=true;
  except
    FindAllAndPasteTextDoc:=false;
  end;
End;

exports
CreateWord, VisibleWord, AddDoc,
CloseDoc, CloseDocEx, CloseWord,
OpenDoc,CopyTextDocToClipboard,
FindAllAndPasteTextDoc, ImportTextFromDoc;

begin
end.
Текст этой библиотеки вместе с модулем можно взять здесь (73,5 Кб).

    Как видно из исходного текста, в секции используемых модулей uses указана ссылка на созданную ранее библиотеку MSWORD. В секции exports перечисляются процедуры и функции из этой библиотеки, которые будут доступны для приложений, использующих динамическую библиотеку.

    Мы не включали функцию FindAllAndPasteTextDoc() в библиотеку MSWORD, поэтому нужно ее отдельно разместить в DLL. Служебное слово export говорит о том, что эта функция должна быть доступна вне модуля.

    Откомпилируем этот проект, в результате чего получим файл DSERVER.DLL.

    После того как динамическая библиотека создана, переходим к ее использованию. Для использования функций и процедур динамического модуля его сначала нужно загрузить. Есть два способа загрузки модуля DLL - неявный (статический) и явный (динамический).

    На следующем шаге мы рассмотрим неявную загрузку DLL.




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