Assembler & Win32
Страница 2. Динамическая библиотека


Пример 2. Динамическая библиотека

Написание динамических библиотек под Win32 также значительно упростилось, по сравнению с тем, как это делалось под Windows 3.x. Исчезла необходимость вставлять startup код, а использование четырёх событий инициализации/деинициализации на уровне процессов и потоков, кажется логичным.

Рассмотрим простой пример динамической библиотеки, в которой всего одна функция, преобразования целого числа в строку в шестнадцатеричной системе счисления.

Файл mylib.asm

Ideal
P586
Radix16
Modelflat
DLL_PROCESS_ATTACH

extrnGetVersion:proc

DataSeg
hInstdd0
OSVerdw0

CodeSeg
proclibEntrystdcall
arg@@hInst:dword,@@rsn:dword,@@rsrv:dword
cmp[@@rsn],DLL_PROCESS_ATTACH
jne@@1
callGetVersion
mov[OSVer],ax
moveax,[@@hInst]
mov[hInst],eax
@@1:moveax,1
ret
endPlibEntry

publicstdcallHex2Str
procHex2Strstdcall
arg@@num:dword,@@str:dword
usesebx
moveax,[@@num]
movebx,[@@str]
movecx,7
@@1:movedx,eax
shreax,4
andedx,0F
cmpedx,0A
jae@@2
addedx,'0'
jmp@@3
@@2:addedx,'A' - 0A
@@3:mov[byte ebx + ecx],dl
dececx
jns@@1
mov[byte ebx + 8],0
ret
endpHex2Str

endlibEntry

Остальные файлы, которые необходимы для данного примера, можно найти в приложении 2.

Краткие комментарии к динамической библиотеке

Процедура libEntry является точкой входа в динамическую библиотеку, её не надо объявлять как экспортируемую, загрузчик сам определяет её местонахождение. LibEntry может вызываться в четырёх случаях:

  • при проецировании библиотеки в адресное пространство процесса (DLL_PROCESS_ATTACH);
  • при первом вызове библиотеки из потока (DLL_THREAD_ATTACH), например, с помощью функции LoadLibrary;
  • при выгрузке библиотеки потоком (DLL_THREAD_DETACH);
  • при выгрузке библиотеки из адресного пространства процесса (DLL_PROCESS_DETACH).

В нашем примере обрабатывается только первое из событий DLL_PROCESS_ATTACH. При обработке данного события библиотека запрашивает версию OS сохраняет её, а также свой handle of instance.

Библиотека содержит только одну экспортируемую функцию, которая собственно не требует пояснений. Вы, пожалуй, можете обратить внимание на то, как производится запись преобразованных значений. Интересна система адресации посредством двух регистров общего назначения: ebx + ecx, она позволяет нам использовать регистр ecx одновременно и как счётчик и как составную часть адреса.

 
« Предыдущая статья