DLL
DLL (акăл. Dynamic-link library — хăвăрт çыхăнмалли библиотека) — Microsoft Windows операци системин ăнлавĕ, ку библитекăпа тĕрлĕ программăсем час-часах усă кураççĕ. DLL шутне çавăн пекех ActiveX-ăн тытăм элеменчĕсемпе драйверсене кĕртеççĕ. UNIX йышши операци системисенче ун вырăнне shared objects («пĕрлехи эскерсене») усă кураççĕ.
Win 9x | Win XP | Vista |
---|---|---|
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-тан импортлани
тӳрлет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 во время работы
тӳрлет 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.
Ссылки
тӳрлет- Windows-ăн DLL файлсен архивĕ
- Тĕрлĕ вырăн валли DLL çырасси тата вĕсене усă курасси 2008 ҫулхи Пуш уйӑхӗн 8-мӗшӗнче архивланӑ.
- MSDN Links: __declspec in C++ Reference, dllexport/dllimport, Dynamic-Link Libraries, Dynamic-Link Library Functions
- Win32 DLL on www.functionx.com. Tutorial for making and using DLL’s
- Delay Load Dlls Error Recovery 2006 ҫулхи Утӑ уйӑхӗн 15-мӗшӗнче архивланӑ. on www.codemaestro.com.