Сборник по задачам и примерам Assembler




Шаг 1. Разработка текста DLL-библиотеки - часть 3


  • vent — значение флага, передаваемого в DLL-библиотеку; f ImpLoad — параметр не равен 0, если библиотека загружена неявно (см. ниже), и равен 0 в обратном случае.
  • Структура полного варианта инициализациониого кода выглядит так:

    includeWindowConA.inc;проверьте присутствие значений флагов в этом файле"

    DllMain ргос

    arg hlnstDLL:dword. event:dword,fImpLoad:dword

    cmp [event].DLL_PROCESS_ATTACH

    jne m выполняем действия для DLL_PROCESS_ATTACH

    cmp [event].DLL_THREAD_ATTACH

    jnem :выполняем действия для DLL_THREAD_ATTACH

    cmp [event]. DLL_THREAD_DETACH

    jnem выполняем действия для DLL_THREAD_DETACH

    cmp [event].DLL_PROCESS_DETACH

    jnem

    выполняем действия для DLL_PROCESS_DETACH m: moveax.l

    ret DllMainendp

    Минимальный вариант может выглядеть так, как это сделано в нашем примере:

    DllMain ргос

    arg hlnstDLL:dword. event:dword,fImpLoad:dword

    m: mov eax.l

    ret DllMainendp

    Или так:

    DllMain: m: moveax.l ret 12

    He забывайте, что директива arg приводит к тому, что в код, генерируемый транслятором, вставляются команды ENTERD и LEAVED (см. выше разделы «Реализация рекурсивных процедур» и «Реализация вложенных процедур»). Кроме этого, команда RET процедуры дополняется значением, равным сумме длин параметров, указанных в директиве ARG . Исполнение такой команды приводит к удалению из стека количества байт, равного этому сформированному значению.

    Что касается кода функций (процедур), составляющих DLL-библиотеку, то для их написания используются обычные правила разработки программ. Описание данных также ничем не отличается от обычной программы ассемблера. Ведь в конечном итоге код и данные процедур DLL-библиотеки оказываются в адресном пространстве процесса наравне с его кодом и данными.

    Последнее, что необходимо отметить, — все экземпляры данных и имена процедур, которые должны быть видны вне пределов DLL-библиотеки, объявляются общими с использованием одной из директив PUBLIC или PUBLICDLL.




    Содержание  Назад  Вперед