
Разделяемая память
Пример использования разделяемой памяти приведен в приложении 6. Запускаемое приложение загружает динамическую библиотеку и вызывает процедуру из динамической библиотеки, которая меняет данные, расположенные опять же в динамической библиотеке. Запустим теперь второй экземпляр приложения. Оно загружает еще один экземпляр динамической библиотеки. Могут быть ситуации, когда желательно, чтобы второе запущенное приложение "знало", что по команде первого приложения данные уже изменились. Ясно, что в этом случае данные, которыми оперирует динамическая библиотека, должны быть общими. Технически это делается очень просто.
Трансляция файлов, приведенных в приложении 6, производится с помощью команд:
ml /c /coff /DMASM dll4.asm
link /subsystem:windows /DLL /section:.data,SRW dll4.obj
ml /c /coff /DMASM dllex4.asm
link /subsystem:windows dllex4.obj
Атрибуты опции SECTION: S-SHARED, R-READ, W-WRITE.
Результат работы программы «dllex4.exe» изображен на рисунках 7 и 8.
Рисунок 7 – Результат работы программы «dllex4.exe». Первое окно
Рисунок 8 – Результат работы программы «dllex4.exe». Второе окно
Выводы
В данной курсовой работе были рассмотрены различные примеры применения dll-библиотек. В каждом из примеров создавались оконные приложения с помощью стандартных процедур языка С. Эти процедуры объявлялись как внешние процедуры и вызывались через стек с помощью вызоваCALL.
Сравнивая явное и неявное связывание программ с динамическими библиотеками, можно заметить, что явное связывание более «гибкое», так как при неявном связывании приходится использовать статические библиотеки. Но, с другой стороны, код программы при неявном связывании меньше, чем при явном связывании.
Использование общей памяти программой и динамической библиотекой делает программу более надежной. С другой стороны, использование разделяемой памяти позволяет использовать одну и ту же динамическую библиотеку нескольким программам одновременно.
Список литературы
Пирогов Владислав Юрьевич «Ассемблер для Windows». – М.: Издатель Молгачева С.В., 2002. – 552 с., ил.
Вахрушева Е.А. «Изучение операционной системы WINDOWS: метод. указания для выполнения курсовой работы по курсу «Операционные системы». – Ижевск: ИжГТУ, кафедра «Вычислительная техника», 2013. – 55 с.
Соковиков В. «MSDN - Windows API Персональный сайт Владимира Соковикова». URL:http://www.vsokovikov.narod.ru(дата просмотра: 22 апреля 2014 г.)
Приложения
Приложение 1
dll1.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
PUBLIC DLLP1
; константы
; сообщения, приходящие при открытии
; динамической библиотеки
DLL_PROCESS_DETACH equ 0
DLL_PROCESS_ATTACH equ 1
DLL_THREAD_ATTACH equ 2
DLL_THREAD_DETACH equ 3
; прототипы внешних процедур
EXTERN MessageBoxA@16:NEAR
; директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;--------------------------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
TEXT1 DB 'Вход в библиотеку',0
TEXT2 DB 'Выход из библиотеки',0
MS DB 'Сообщение из библиотеки',0
TEXT DB 'Вызов процедуры из DLL',0
_DATA ENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; [EBP+10H] ; резервный параметр
; [EBP+0CH] ; причина вызова
; [EBP+8] ; идентификатор DLL-модуля
DLLENTRY:
MOV EAX,DWORD PTR [EBP+0CH]
CMP EAX,0
JNE D1
; закрытие библиотеки
PUSH 0
PUSH OFFSET MS
PUSH OFFSET TEXT2
PUSH 0
CALL MessageBoxA@16
JMP _EXIT
D1:
CMP EAX,1
JNE _EXIT
; открытие библиотеки
PUSH 0
PUSH OFFSET MS
PUSH OFFSET TEXT1
PUSH 0
CALL MessageBoxA@16
_EXIT:
MOV EAX,1
RET 12
;———————————————————
; [EBP+8] ; параметр процедуры
DLLP1 PROC EXPORT
PUSH EBP
MOV EBP,ESP
CMP DWORD PTR [EBP+8],1
JNE _EX
PUSH 0
PUSH OFFSET MS
PUSH OFFSET TEXT
PUSH 0
CALL MessageBoxA@16
_EX:
POP EBP
RET 4
DLLP1 ENDP
_TEXT ENDS
END DLLENTRY