Dynamic Link Library #3Доброго времени суток, уважаемые подписчики. Сегодня мы продолжим разбирать возможности динамических библиотек и создадим ещё несколько макросов для удобности написания программы. Начнём с макросов. При написании программ с большим количеством функций и большими возможностями код программы неукротимо растёт, при этом понимаемость значительно уменьшается, поэтому рано или поздно нужно принимать определённые меры по уменьшению кол-ва написанного и увеличению читаемости. Во многих случаях это привело к созданию более высоких языков программирования, нам же важно не особо откланяться от низкоуровневого программирования, иначе использовать именно ассемблер потеряет смысл, но при этом облегчить себе работу. В программах, работающих под операционной системой Windows, достаточно большую часть кода занимают многочисленные push-ы, при этом они никак не помогают понять, какое именно действие они производят, передачу параметра или сохранение регистра в стеке. Для внесения однозначности, и для упрощения написания программы, я считаю удобным использование следующего макроса:
run macro address,p1,p2,p3,p4,p5,p6,p7,p8,p9 оператор IFNB <> проверяет наличие параметра и выполняет последующие строки, только если параметр задан. В данном случае макрос помещает до девяти операндов в стек и вызывает заданную процедуру. На практике это означает следующие преобразования:
Обратите внимание на обратный порядок передачи параметров, пока не буду подробно объяснять, но уверяю, так гораздо удобнее. Теперь перейдём к библиотекам, в этом уроке я хочу показать, что динамическая библиотека может содержать не только часто используемые процедуры, но также данные и ресурсы. Для этого мы рассмотрим две программы, работающие с библиотекой dll2.dll, которая помимо кода и данных содержит в себе файл ресурсов dll2.res. Файл dll2.asm имеет следующее содержание:
Библиотека содержит одну единственную процедуру, которая в свою очередь возвращает адрес строки, находящейся в блоке данных библиотеки. Рассмотрим первую программу, dll_data.asm:
После компиляции эта программа будет только выводить MessageBox со строкой, находящейся в библиотеке. Если перекомпилировать библиотеку с другой строкой, то текст MessageBox - a изменится. Ничего сложного здесь нет, но этот пример очень хорошо демонстрирует то, что сама программа и загруженные библиотеки имеют общее адресное пространство. Следующая программа, dll_res.asm, будет использовать ресурсы скомпилированные в библиотеку, она выглядит следующим образом:
Я думаю что это достаточно постой в понимании пример. Единственное на что следует обратить внимание на параметры функции DialogBoxParam, певым параметром мы передаём ей handle библиотеки, так как в этот раз файл ресурсов был добавлен к библиотеке, а не к программе. Следующие файлы доступны для скачивания: На сегодня это всё. Если есть какие вопросы, пишите, обязательно отвечу. Пишите, Dark_Lord@RusFAQ.ru, Dark_Lord@land.ru. |