На этом шаге мы рассмотрим использование статической загрузки DLL.
Для того чтобы использовать статическую загрузку модуля, достаточно описать процедуры и функции этого модуля, которые вы будете задействовать в своем приложении (лучше сделать это в отдельном модуле unit). Такое описание состоит из имени функции (процедуры), под которым она будет использована в приложении, зарезервированного слова external, строки с именем файла библиотеки DLL, зарезервированного слова name и строки, содержащей имя функции (процедуры) в динамическом модуле. Следующий программный код содержит такое описание.
function CreateWord_DLL:boolean; external 'dserver.dll' name 'CreateWord'; function VisibleWord_DLL(kod:boolean):boolean; external 'dserver.dll' name 'VisibleWord'; function AddDoc_DLL(name:string):variant; external 'dserver.dll' name 'AddDoc'; function FindAllAndPasteTextDoc_DLL(document:variant; findtext,pastetext:string):boolean; external 'dserver.dll' name 'FindAllAndPasteTextDoc'; function OpenDoc_DLL(filename:string):variant; external 'dserver.dll' name 'OpenDoc'; function CopyTextDocToClipboard_DLL(document:variant):boolean; external 'dserver.dll' name 'CopyTextDocToClipboard'; function ImportTextFromDoc_DLL(document:variant):string; external 'dserver.dll' name 'ImportTextFromDoc'; function CloseDocEx_DLL(document:variant;saved:boolean):boolean; external 'dserver.dll' name 'CloseDocEx'; function CloseWord_DLL:boolean; external 'dserver.dll' name 'CloseWord';
Если модуль DLL откомпилирован, размещен на диске компьютера и доступен приложению, а описание процедур и функций этого модуля в использующем его приложении не содержит ошибок, то приложение запустится без проблем. Тогда во время запуска приложения также будет загружен динамический модуль. Если файл DLL не доступен приложению, которое его использует и загружает неявно, то загрузка приложения вызовет ошибку.
Рис.1. Ошибка, возникающая при отсутствии DLL
Если в модуле отсутствует функция, описываемая в приложении, то это также вызовет ошибку.
Рис.2. Ошибка, возникающая при ссылке на отсутствующую функцию
Достоинство метода неявной загрузки модуля DLL заключается в простоте его использования. Недостаток метода проявляется во время загрузки приложения на выполнение, если описания функций (процедур) в приложении и модуле не совпадают. Для решения этой проблемы приходится или корректировать исходный текст приложения или исправлять ошибки в модуле DLL.
Используем созданную библиотеку в приложении Delphi. Вот его полный текст.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses MSWORD; {$R *.dfm} function CreateWord_DLL:boolean; external 'dserver.dll' name 'CreateWord1'; function VisibleWord_DLL(kod:boolean):boolean; external 'dserver.dll' name 'VisibleWord'; function AddDoc_DLL(name:string):variant; external 'dserver.dll' name 'AddDoc'; function FindAllAndPasteTextDoc_DLL(document:variant; findtext,pastetext:string):boolean; external 'dserver.dll' name 'FindAllAndPasteTextDoc'; function OpenDoc_DLL(filename:string):variant; external 'dserver.dll' name 'OpenDoc'; function CopyTextDocToClipboard_DLL(document:variant):boolean; external 'dserver.dll' name 'CopyTextDocToClipboard'; function ImportTextFromDoc_DLL(document:variant):string; external 'dserver.dll' name 'ImportTextFromDoc'; function CloseDocEx_DLL(document:variant;saved:boolean):boolean; external 'dserver.dll' name 'CloseDocEx'; function CloseWord_DLL:boolean; external 'dserver.dll' name 'CloseWord'; procedure TForm1.Button1Click(Sender: TObject); var document: variant; begin // Запускаем Word и отображаем окно if Not CreateWord_DLL then exit; VisibleWord_DLL(True); // Создаем новый документ по шаблону document:=AddDoc_DLL(ExtractFileDir(Application.ExeName)+ '\Конверт.dot'); MessageBox(handle,'Шаблон почтового конверта создан!', 'Внимание!',0); // Подставляем адрес FindAllAndPasteTextDoc_DLL(document,'###индекс&','350049'); FindAllAndPasteTextDoc_DLL(document,'###адрес&', 'Краснодар, ул. Севастопольская, д. 3, кв. 123'); FindAllAndPasteTextDoc_DLL(document,'###Получатель&', 'Иванов Иван Иванович'); // Обратный адрес FindAllAndPasteTextDoc_DLL(document, '###обратный индекс&', '198005'); FindAllAndPasteTextDoc_DLL(document,'###обратный адрес&', 'Санкт-Петербург, Измайловский пр., д. 29, кв. 111'); FindAllAndPasteTextDoc_DLL(document,'###отправитель&', 'Петрова Светлана Ивановна'); end; end.
Результат работы приложения изображен на рисунке 3.
Рис.3. Результат работы приложения
В большинстве случаев более удобно использовать явную, или динамическую загрузку модуля DLL. Это связано с тем, что даже если будут изменены некоторые функции модуля, то на загрузке приложения это никак не отразится. Не будут выполняться только те функции и процедуры, которые были ошибочно изменены.
На следующем шаге мы рассмотрим динамическую загрузку DLL.