Страница 2 из 5
Пример 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 одновременно и как счётчик и как составную часть адреса. |