На этом шаге мы рассмотрим алгоритм создания 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.
Как видно из исходного текста, в секции используемых модулей uses указана ссылка на созданную ранее библиотеку MSWORD. В секции exports перечисляются процедуры и функции из этой библиотеки, которые будут доступны для приложений, использующих динамическую библиотеку.
Мы не включали функцию FindAllAndPasteTextDoc() в библиотеку MSWORD, поэтому нужно ее отдельно разместить в DLL. Служебное слово export говорит о том, что эта функция должна быть доступна вне модуля.
Откомпилируем этот проект, в результате чего получим файл DSERVER.DLL.
После того как динамическая библиотека создана, переходим к ее использованию. Для использования функций и процедур динамического модуля его сначала нужно загрузить. Есть два способа загрузки модуля DLL - неявный (статический) и явный (динамический).
На следующем шаге мы рассмотрим неявную загрузку DLL.