Неявная (статическая) загрузка модуля 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий