Трансляция и компоновка исходного текста DLL-библиотеки. Создание lib-файла.
Шаг 2.
После того как подготовлен исходный текст библиотеки, его транслируют обычным для программ ассемблера образом. Что же касается компоновки, то необходимо помнить, что ее целью является получение файла с расширением .dll, а не обычного файла с расширением .ехе.
Весь этот процесс удобно обсуждать на примере реального файла makefile, текст которого приведен ниже:
TASM0PT=/m3 /mx /z /q /DWINVER=0400 /D_WIN32_WINNT=0400 !1f $d(DEBUG) TASMDEBUG=/zi LINKDEBUG=/v lelse TASMDEBUG=/1 LINKDEBUG= lendif !if Sd(MAKEDIR) IMP0RT=import32 lelse IMP0RT=import32 lendif ${NAME).EXE: $(OBJS) $(DEF) t1ink32 /Tpd /aa /c $(LINKDEBUG) $(OBJS).$(NAME).. S(IMPORT). $(DEF).asm.obj: tasm32 KTASMDEBUG) S(TASMOPT) $&.asm
Запуск данного файла производится командной строкой:
make – DOEBUG – fmakefile_dll.mak >p.txt
В результате формируется несколько файлов, перечень которых определяется тем, насколько успешно отработали программы транслятора tasm32 и компоновщика nk.32. Для быстрой оценки этого результата мы перенаправили весь вывод в файл p.txt. Просмотрев этот файл, можно оценить успешность создания DLL-библиотеки, не анализируя другие файлы (например, файл листинга). При наличии синтаксических ошибок необходимо исправить их и повторить запуск make-файла на исполнение.
Для успешной компоновки необходим еще один файл – с расширением .def. Необходимое и достаточное содержимое файла maket_dll.def приведено ниже:
LIBRARY maketjll DESCRIPTION 'Win32 DLL' EXPORTS WriteCon @1
В этом файле следует обратить внимание на директиву EXPORTS, которая содержит имена экспортируемых функций DLL-библиотеки и их ординалы, то есть порядковые номера этих функций в DLL-библиотеке. Последние использовались в 16-разрядных версиях Windows, однако в современных версиях этой операционной системы их использование необязательно, и Microsoft настоятельно рекомендует этого не делать.
О том, что компоновщик должен создать именно DLL-библиотеку, указывают с помощью ключа /Tpd.
Шаг 3.
Как указать приложению местонахождение внешних функций, расположенных в DLL-библиотеках? Если бы приложение использовало только одну DLL-библиотеку, то проблем бы не было – указывай нужную и продолжай процесс сборки приложения. Если количество необходимых приложению DLL-библиотек больше одной, а тем более если их десятки, то ситуация требует иного решения, нежели простое перечисление нужных приложению DLL-библиотек.
Для централизованного хранения информации о размещении используемых приложением функций в DLL-библиотеках применяют LIB-файлы. Эти файлы представляют собой своеобразный справочник о размещении функций в DLL-библиотеках. При этом не указывается никаких путей, так как при обращении к DLL-библиотеке операционная система ищет ее по следующему алгоритму.
- В каталоге, содержащем ехе-файл приложения.
- В текущем каталоге процесса.
- В системном каталоге Windows.
- В основном каталоге Windows.
- В каталогах, указанных в переменной окружения PATH.
В пакете TASM для создания LIB-файла предназначена утилита Implib.exe. Для создания LIB-файла в нашем примере необходимо выполнить следующую командную строку:
IMPLIB.EXE maketjll.lib maket_dll.DLL >p.txt
Как видите, мы опять используем перенаправление вывода в файл p.txt для быстрой оценки результата работы программы IMPLIB.EXE. Если выполнение этой утилиты было успешным, то формируется файл maket_dll.lib, который в дальнейшем используется для сборки целевого приложения.