Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





5.10. Применение библиотек динамической компоновки (DLL)
Библиотеки динамической компоновки (Dynamic Link Libraries — DLL) являются неотъемлемой и, Пожалуй, наиболее важной частью операционных систем Windows. Они служат хранилищем многочисленных процедур, в том числе и функций WIN API, и являются мощным средством для написания эффективных приложений. Не будем останавливаться на принципах построения и функционирования DLL, поскольку имеется масса публикаций, Программирование на ассемблере в Windows: от простого к сложному 401 посвященных этой теме. Гораздо более интересно научиться самому создавать библиотеки динамической компоновки. Библиотеки DLL, независимо от того, какими средствами программирования они созданы, могут использоваться с любыми компиляторами и в любых программах. Посмотрим, как создаются DLL на языке ассемблера фирмы Microsoft.

DLL-библиотека может быть создана как обычный файл ассемблера. В любой библиотеке присутствует код инициализации, который может получать управление в одном из четырех случаев. Нас будет интересовать практическое применение DLL, поэтому рассмотрим минимальный код, необходимый для написания библиотек:
.386
.model flat, stdcaii
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.code
LibMain proc hlnstDLL:DWORD, reason:DWORD, unused:DWORD
mov EAX, 1
ret

LibMain Endp
End LibMain

Точка входа DLL-библиотеки может иметь любое имя. Представленный фрагмент кода DLL просто возвращает значение 1 (TRUE). Это простейший вариант библиотеки DLL. Программист может написать свои процедуры, используя этот шаблон. Я покажу на примере, как это сделать.
Разработаем DLL, содержащую две процедуры, — сложения двух чисел Sum2 и вычитания Sub2. Исходный текст библиотеки сохраним в файле Sum2.asm. Нашей конечной целью является создание библиотеки Sum2.dll и демонстрация рабОТЫ Процедур Sum2 И Sub2.
В качестве входных параметров процедура sum2 принимает значения двух целочисленных переменных il и i2, а в качестве результата возвращает их сумму. Процедура Sub2 выполняет вычитание двух целых чисел. Исходный текст библиотеки приведен в листинге 5.25.
Листинг 5.25. Библиотека DLL,J содержащая процедуры Sum2 и Sub2 ,
. SUM2.ASM
.386
.model flat, stdcaii
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
. code
LibMain proc hlnstDLL:DWORD, reason:DWORD, unused:DWORD
mov EAX, 1
ret
LibMain Endp
Sum2 proc
push EBP
mov EBP, ESP
mov EAX, [EBP+8] ; здесь находится il
add EAX, [EBP+12] ; здесь находится i2
pop EBP
ret 8
Sum2 endp
Sub2 proc
push EBP
mov EBP, ESP
mov EAX, [EBP+8]
sub EAX, [EBP+12]
pop EBP
ret 8
Sub2 endp
End LibMain

Компиляция и сборка файла DLL обычно выполняется при помощи ВАТ-
файла. Содержимое такого файла может быть, к примеру, таким:
@echo off
if exist Sum2.obj del Sum2.obj
if exist Sum2.dll del Sum2.dll
\masm32\bin\ml /с /coff Sum2.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:Sum2.def Sum2.obj
dir Sum2.
pause

Естественно, что в каждой конкретной конфигурации операторы файла могут
быть другими. Запустим такой ВАТ-файл на выполнение. Если в исходном
тексте файла Sum2 нет ошибок, то на выходе получим файл библиотеки
с расширением DLL, т. е. Sum2.dll. Обратите внимание, что помимо
Sum2.asm требуется файл Sum2.def. В этом файле описаны процедуры, экспортируемые
из библиотеки DLL. У нас две процедуры, и файл Sum2.def
будет иметь три записи:
LIBRARY Sum2
EXPORTS Sum2
Sub2


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru