Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodychka-lab_OS.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.35 Mб
Скачать

2. Приклад програми створення dll

;--------------------------------------------------

; My_DLL.asm

;---------------------------------------------------

.386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

.data

AppName db "My_DLL",0

HelloMsg db "Привіт! Це функція з бібліотеки My_DLL",0

LoadMsg db "Завантаження бібліотеки DLL у пам'ять ",0

UnloadMsg db "Вивантаження бібліотеки DLL з пам'яті",0

ThreadCreated db "Створення вітки у цьому процесі",0

ThreadDestroyed db "Знищення вітка цього процесу",0

.code

DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD

.if reason==DLL_PROCESS_ATTACH

invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK

.elseif reason==DLL_PROCESS_DETACH

invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK

.elseif reason==DLL_THREAD_ATTACH

invoke MessageBox,NULL,addr ThreadCreated,\

addr AppName,MB_OK

.else ;.if reason== DLL_THREAD_DETACH

invoke MessageBox,NULL,addr ThreadDestroyed,\

addr AppName,MB_OK

.endif

mov eax,TRUE

ret

DllEntry Endp

TestHello proc

invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK

ret

TestHello endp

End DllEntry

Опис файлу лістинга з розширенням *.def

;--------------

; My_DLL.def

;--------------

LIBRARY My_DLL

EXPORTS TestHello

  1. Опис програми My_dll.Asm та файлу лістінга My_dll.Def

Кожна DLL повинна мати стартову функцію.

Windows викликає цю функцію у випадку коли:

- DLL завантажується перший раз у пам’ять;

- DLL вивантажується з пам’яті;

- створюється нова вітка в цьому ж процесі;

- знищується нова вітка цього процесу;

Ця функція одержує три параметри:

hinstDLL – це дескриптор модуля DLL.

reason - може мати одне з чотирьох значень:

  • DLL_PROCESS_ATTACH – DLL одержує це значення коли вперше загружається в адресний простір процесу.

  • DLL_PROCES_DETACH – DLL одержує це значення коли вивантажується з адресного простору процесу.

  • DLL_THREAD_ATTACH – DLL одержує це значення коли процес створює нову вітку.

  • DLL_THREAD_DETACH –DLL одержує це значення коли процес

reserved – визначає наступні аспекти встановлення або очищення

DLL. (рідко викоритовується)

Для того, щоб можна було використовувати функції з бібліотеки іншою програмою, їх потрібно оголосити в файлі імпорту : My_DLL.def

LIBRARY My_DLL

EXPORTS TestHello

LIBRARY - Вказує ім’я бібліотеки.

EXPORTS - Повідомляє компонувальник (лінкер) які функції в DLL експортуються, тобто викликаються із інших програм. В даному випадку нам потрібно щоб інші програми могли викликати функцію TestHello.

4. Трансляція та компонування dll Для того, щоб відтранслювати(ml.Exe) та зкомпонувати (link.Exe) даний .Asm код, потрібно використовувати наступні параметри:

ML.EXE /c /coff /Cp My_DLL.asm

LINK.EXE /DLL /SUBSYSTEM:WINDOWS /DEF:My_DLL.def /LIBPATH:d:\masm32\lib My_DLL.obj

Опис параметрів:

/c – говорить MASM’у створити .obj файл формату COFF (Common Object File), який використовується в ОС UNIX як його власний об'єктний і виконуваний формат файлів.

/Cp – говорить MASM’у зберігати регістр назв, заданих програмістом. Можна також вставити в код програми (після директиви .model) стрічку :option casemap:none, щоб одержати такий самий ефект, тобто, щоб MASM розрізняв великі і малі символи.

/DLL – говорить link’еру створити DLL

/SUBSYSTEM:WINDOWS – говорить ink’еру якого виду буде виконуваний модуль.

/DEF - підключає файл імпорту в якому оголошені функції.

/LIBPATH – говорить link’еру де знаходяться бібліотеки імпорту.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]