DLLpiton.net.ru
Главная arrow Статьи arrow DLL (Dynamic Link Library)
Главная
Форум
Магазин
- - - - - - -
Исходники
Статьи
Материалы
FTP
- - - - - - -
Поиск
Каталог ссылок
Контакты
Ленты новостей
Ча.Во. (FAQ)
Анекдоты
Java программы
Доска заказов программ
Лицензия Dllpiton
Кто на сайте?
 
DLL (Dynamic Link Library) Печать E-mail
Цели введения 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() }
begin
end.


C и C++
#include
/* Эта функция экспортируется */
extern "C" __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
/*
* Указываем, что тело функции находится в другом файле.
* Не забыть про объектный модуль 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
#include
/*
* Тип используемой функции
* (комбинация типов параметры и возвращаемого значения)
*/
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.
 
« Пред.   След. »
 
 
 
19.06.2018 г.
up!