DLL

DLL

DLL

Winvistadll.png

DLL (англ. Dynamic-link library — динамически подключаемая библиотека) — понятие операционных систем Microsoft Windows и IBM OS/2; динамическая библиотека, позволяющая многократное применение различными программными приложениями. K DLL относятся также элементы управления ActiveX и драйверы. В мире UNIX аналогичные функции выполняют т. н. shared objects («разделяемые объекты»).

Формат файлов DLL придерживается тех же соглашений, что и формат исполняемых файлов, сочетая код, таблицы и ресурсы.

Содержание

Цели введения DLL

Первоначально предполагалось, что введение DLL позволит эффективно организовать память и дисковое пространство, используя только один экземпляр библиотечного модуля для различных приложений. Это было особенно важно для ранних версий Microsoft Windows с жёсткими ограничениями по памяти.

Далее, предполагалось улучшить эффективность разработок и использования системных средств за счёт модульности. Замена DLL-программ с одной версии на другую должна была позволить независимо наращивать систему, не затрагивая приложений. Кроме того, библиотеки DLL могли использоваться разнотипными приложениями — например, Microsoft Office, Microsoft Visual Studio и т. п.

В дальнейшем идея модульности выросла в концепцию COM.

Фактически, полных преимуществ от внедрения DLL получить не удалось по причине явления, называемого DLL hell («ад DLL»). DLL Hell возникает, когда несколько приложений требуют одновременно различные, не полностью совместимые, версии DLL-библиотек, что приводит к сбоям в этих приложениях. Когда система выросла до определённых размеров, количество DLL стало превышать многие тысячи, не все из них обладали полной надёжностью и совместимостью, и конфликты типа DLL Hell стали возникать очень часто, резко понижая общую надёжность системы. Поздние версии Microsoft Windows стали разрешать параллельное использование разных версий DLL, что свело на нет преимущества изначального принципа модульности.

Примеры использования DLL в разных языках

Экспорт в DLL

Delphi

 library Example;
 
 { Производим некие действия и возвращаем результат }
 function AddNumbers(a, b: Double): Double; cdecl;
 begin
   AddNumbers := a + b
 end;
 
 { Эта функция экспортируется }
 exports
   AddNumbers;
 
 { Инициализатор DLL, аналог функции main() в языках C и C++ }
 begin
 end.

C и C++

 #include <windows.h>
 
 #define DLLEXPORT extern "C" __declspec(dllexport)
                 // extern "C" обозначает использование простой генерации
                 // сигнатуры функции (в стиле языка С) при получении объектных
                 // файлов. В частности, это запрещает компилятору C++
                 // производить "декорацию" (или "украшение") имени функции
                 // дополнительными символами при экспорте в DLL
 
 /* Эта функция экспортируется */
 DLLEXPORT double AddNumbers(double a, double b)
   // Прототип функции (функция без тела). По данной заявленной сигнатуре функции поиск её тела
   // при линковке будет произведён ниже или в другом бинарном файле 
 ;
 
 /* Инициализационная функция DLL, аналог main() */
 bool APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
 {
   return TRUE;
 }
 
 /* 
    Тело (реализация) заявленного выше прототипа функции.
    Производит некие действия и возвращает результат
  */
 DLLEXPORT double AddNumbers(double a, double b)
 {
   return a + b;
 }

Пример компиляции абстрактных файлов a.cpp и b.cpp в res.dll из командной строки при помощи GCC:

g++ -c a.cpp -o a.o -DBUILDING_DLL=1
g++ -c b.cpp -o b.o -DBUILDING_DLL=1
dllwrap a.o b.o -o res.dll
del a.o b.o

Импорт из DLL

Visual Basic

Функция должна быть объявлена в TLB, а TLB подключена к проекту. Именно этот механизм в VB используется для импорта всех «встроенных» функций (таких как MsgBox, Round, и т. д.) из runtime-библиотеки.

Delphi

 program Example;
 {$APPTYPE CONSOLE}
 
 { Указываем, что функция находится в DLL }
 function AddNumbers(a, b: Double): Double; cdecl; external 'Example.dll';
 
 { Используем функцию как обычно }
 var result: Double;
 begin
   result := AddNumbers(1, 2);
   Writeln('The result was: ', result)
 end.

C и C++

 #include <stdio.h>
 
 /*
  * Указываем, что тело функции находится в другом файле.
  * Не забыть про объектный модуль DLL при линковке!
  */
 extern "C" __declspec(dllimport)double AddNumbers(double a, double b);
 
 /* Используем функцию как обычно */
 int
 main(int argc, char **argv)
 {
     double result = AddNumbers(1, 2);
     printf("The result was: %f\n", result);
     return 0;
 }

Подгрузка и импорт из DLL во время работы

Visual Basic

 Option Explicit
 
 ' Указываем, что функция находится во внешней DLL.
 Declare Function AddNumbers Lib "Example.dll" _ 
           (ByVal a As Double, ByVal b As Double) As Double
 
 ' Используем функцию как обычно
 Sub Main()
     Dim Result As Double
     Result = AddNumbers(1, 2)
     Debug.Print "The result was: " & Result
 End Sub

C и C++

 #include <windows.h>
 #include <stdio.h>
 
 /*
  * Тип используемой функции
  * (комбинация типов параметры и возвращаемого значения)
  */
 typedef double (*importFunction)(double, double);
 
 int
 main(int argc, char **argv)
 {
     importFunction addNumbers;
     double result;
 
     /* Загружаем DLL в память */
     HINSTANCE hinstLib = LoadLibrary("Example.dll");
     if (hinstLib == NULL) {
         printf("ERROR: unable to load DLL\n");
         return 1;
     }
 
     /* Получаем указатель на функцию */
     addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers");
     if (addNumbers == NULL) {
         printf("ERROR: unable to find DLL function\n");
         return 1;
     }
 
     /* Вызываем функцию через указатель */
     result = addNumbers(1, 2);
 
     /*
      * Выгружаем DLL (в принципе, это будет сделано
      * автоматически при выходе из программы)
      */
     FreeLibrary(hinstLib);
 
     /* Отображаем результат */
     printf("The result was: %f\n", result);
 
     return 0;
 }

Delphi

 program Example;
 {$APPTYPE CONSOLE}
 
 var result: Double;
     LibHandle: Hmodule;
     AddNumbers: function(a, b: Double): Double;
 begin
   LibHandle := LoadLibrary('Example.dll'); // загружаем DLL
   if LibHandle <> 0 then
     begin
       @AddNumbers := GetProcAddress(LibHandle, 'AddNumbers'); // запоминаем адрес
                                                               // необходимой функции
       if @AddNumbers <> nil then
         begin
           result := AddNumbers(1, 2);       // используем функцию
           Writeln('The result was: ', result);
         end;
       FreeLibrary(LibHandle);               // выгружаем DLL
     end;
 end.

См. также

  • Dependency Walker, утилита, показывающая экспортируемые и импортируемые функции файлов DLL и EXE.

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "DLL" в других словарях:

  • DLL — steht in der Informatik für: Dynamic Link Library, Dynamische Verbindungsbibliothek Dynamic Link Loader, ein Bestandteil des Betriebssystems BS2000 Data Link Layer, die Sicherungsschicht im OSI Modell den Davis Logemann Loveland Algorithmus zur… …   Deutsch Wikipedia

  • DLL —   [Abk. für Dynamic Link Library, »dynamische Bibliothek (von Programmverbindungen)«], eine Datei, die nach dem Bibliothekskonzept (Bibliothek) angelegt und genutzt wird. Dabei werden Routinen nicht dauerhaft mit dem Maschinencode eines Programms …   Universal-Lexikon

  • .dll — dll,   Erweiterung für eine DLL Datei (DLL) …   Universal-Lexikon

  • DLL — may refer to: Data link layer, a layer in the OSI network architecture model Delay locked loop, a device to reduce clock skew in digital circuits Doubly linked list, a data structure in computer programming Dynamic link library, or a DLL file, as …   Wikipedia

  • Dll — ist eine Abkürzung in der Informatik für: Dynamic Link Library, Dynamische Verbindungsbibliothek Dynamic Link Loader, ein Bestandteil des Betriebssystems BS2000 den Davis Logemann Loveland Algorithmus zur Lösung des Erfüllbarkeitsproblems Double… …   Deutsch Wikipedia

  • DLL — es el acrónimo de Dynamic Linking Library (Bibliotecas de Enlace Dinámico), término con el que se refiere a los archivos con código ejecutable que se cargan bajo demanda del programa por parte del sistema operativo. Esta denominación se refiere a …   Enciclopedia Universal

  • DLL — (dynamic link library) (Computers) file containing the executable routines of a program (in the operating systems Windows and OS/2) …   English contemporary dictionary

  • DLL — (computing) abbrev Dynamic link library * * * Computing abbr. dynamic link library, a collection of subroutines stored on disk, which can be loaded into memory and executed when accessed by a running program …   Useful english dictionary

  • Dll — Bibliothèque logicielle Pour les articles homonymes, voir Bibliothèque (homonymie) et DLL. En informatique, une bibliothèque ou librairie[1] logicielle (ou encore, bibliothèque de programmes) est un ensemble de fonctions utilitaires, regroupées… …   Wikipédia en Français

  • DLL — ▪ computer code file in full  dynamic link library        a file containing code for commonly used program functions on personal computers (personal computer) (PCs) that run the Microsoft Corporation s Windows operating system.       Linking is… …   Universalium


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»