Шаг 227.
Неявная (статическая) загрузка модуля DLL

    На этом шаге мы рассмотрим использование статической загрузки 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.
Текст этого приложения вместе с сопутствующими файлами можно взять здесь (54,2 Кб).

    Результат работы приложения изображен на рисунке 3.


Рис.3. Результат работы приложения

    В большинстве случаев более удобно использовать явную, или динамическую загрузку модуля DLL. Это связано с тем, что даже если будут изменены некоторые функции модуля, то на загрузке приложения это никак не отразится. Не будут выполняться только те функции и процедуры, которые были ошибочно изменены.

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




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