DLL (акăл. Dynamic-link library — хăвăрт çыхăнмалли библиотека) — Microsoft Windows операци системин ăнлавĕ, ку библитекăпа тĕрлĕ программăсем час-часах усă кураççĕ. DLL шутне çавăн пекех ActiveX-ăн тытăм элеменчĕсемпе драйверсене кĕртеççĕ. UNIX йышши операци системисенче ун вырăнне shared objects («пĕрлехи эскерсене») усă кураççĕ.

Win 9x Win XP Vista
Ӳкерчĕк:Win9xdll.png
Ӳкерчĕк:Winxpdll.png
Ӳкерчĕк:Winvistadll.png

DLL файлсен форматне ĕçлĕ файлсене йĕркелеме усă куракан килĕшӳсемпех йĕркелеççĕ.

DLL хатĕрлеме пуçланин сăлтавĕ

тӳрлет

Чи малтан, DLL тăвас шухăш çуралсан, пĕр библиотекăнах темиçе программа усă курма пултарнă май астăвăмпа диск уçлăхĕ лайăхрах йĕркеленĕ тесе шутланă. Астăвăма усă курнă чухне чикĕсем пуррине кура ун пек йĕркелӳ уйрăмах Microsoft Windows-ăн малтанхи версисемшĕн питĕ кирлĕ пулнă.

Каярах модульлĕхпе усă курса DLL хатĕрлессипе система пайĕсене усă курассине çăмăлатмалла пулнă. DLL-программăн версине улăштарни программăна пырса тивмелле пулман, система вара анлăланса пымалла пулнă. Унсăр пуçне пĕр DLL библиотекăна тĕрлĕ йышши программăсем усă курма пултарнă — тĕслĕхрен, Microsoft Office, Microsoft Visual Studio тата çавăн йышши ыттисем те.

Модульлĕ хатĕрлес шухăш каярах COM концепцине куçнă.

DLL hell («DLL тамăкĕ») ятлă пулăма пула DLL-ăн лайăх енĕсемпе туллин усă курма май килмен. DLL Hell ятлă пулăм темиçе расна программа хăйĕн ĕçĕ валли DLL библиотекăн тĕрлĕ версине ыйтма пуçланипе пуçланать, çапла май вăл программăсенче йăнăшсем тухма пуçлаççĕ. Уйрăмах ку пулăм системăри DLL библиотекăсен шучĕ нумайланма пуçласан тĕл пулать. Microsoft Windowsăн каяраххи версисенче библиотекăн расна версисене усă курма ирĕк панă, анчах та апла май DLL-ăн лайăх енĕсенчен пĕрине пĕтернĕ. Унсăр пуçсăр хăш-пĕр DLL шанчăклă мар пулни те, пĕрле ĕçлейменни те DLL библиотекин лайăх енĕсене чакарнă.

DLL-а тĕрлĕ чĕлхесенче усă курнин тĕслĕхĕсем

тӳрлет

DLL экспортласси

тӳрлет
 library Example;
 
 { Ĕç тăватпăр та пĕтмĕше (результата) каялла тавăратпăр }
 function AddNumbers(a, b: Double): Double; cdecl;
 begin
   AddNumbers := a + b
 end;
 
 { Ку функцине экспортлатпăр }
 exports
   AddNumbers;
 
 { DLL пуçаруçи, C-пе C++ чĕлхесенчи main() функцине пĕр килекен }
 begin
 end.
 #include <windows.h>
 
 /* Ку функци экспортсланать */
 extern "C" // Ĕскер файлĕсене илнĕ вăхăтра функци сигнатурине (С чĕлхери пек) хатĕрленĕ чухне 
            // ансат генерацине усă курмалла.
            // Ку, сăмахран, C++ компилятора DLL-а экспортланă вăхăтра функци ятĕнче хушма 
            // паллăсене усă курса "эрешлеме" чарать
 __declspec(dllexport) double AddNumbers(double a, double b)
   // Функци прототипĕ (кĕлеткесĕр функци). Функцире палăртнă сигнатура тăрăх унăн кĕлеткин шыравĕ 
   // аяларах, çыпăçтарнă вăхăтра, е тепĕр бинарлă файлта иртĕ
 ;
 
 /* DLL пуçару функцийĕ, main() евĕрлĕ */
 BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
 {
   return TRUE;
 }
 
 /* 
    Çӳлерех пĕлтернĕ функци прототипĕн кĕлетки.
    Ĕçленĕ хыççăн пĕтмĕше тавăрать
  */
 double AddNumbers(double a, double b)
 {
   return a + b;
 }

DLL-тан импортлани

тӳрлет
 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.
 #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 во время работы

тӳрлет
 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
 #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;
 }
 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.

Ссылки

тӳрлет