Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
23
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

Контрольные вопросы

  1. Какие объекты ядра можно использовать как объекты синхронизации?

  2. Когда объект ядра «процесс» находится в свободном, а когда в занятом состоянии?

  3. Как потоки различных процессов могут использовать один и тот же объект семафор, мьютекс или событие для синхронизации?

  4. Чем объект мьютекс отличается от других объектов синхронизации?

  5. Чем объект семафор отличается от других объектов синхронизации?

  6. В каких случаях следует использовать события со сбросом вручную, а в каких события с автосбросом?

8. Лабораторная работа № 8

СОЗДАНИЕ ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫХ БИБЛИОТЕК

8.1. Цель работы

Целью данной работы является разработка динамически подключаемых библиотек (Dynamic-Link Libraries- DLL). В данной лабораторной работе рассматриваются следующие вопросы:

  • Методы загрузки DLL (явная и неявная загрузки);

  • Методы внедрения DLL в адресное пространство другого процесса.

8.2 Теоретическое введение

Динамически подключаемые библиотеки используются для хранилища отдельных процедур. Множество процедур, обычно с похожей функциональной направленностью содержится в DLL, как отдельные процедуры, а не как часть одной большой конструкции. DLL являются краеугольным камнем ОС Windows, начиная с самой первой ее версии. Четыре самые важные DLL ОС Windows:

  • Kernel32.dll – управление памятью, процессами и потоками;

  • User32.dll – поддержка пользовательского интерфейса, в том числе функции, связанные с созданием окон и передачей сообщений;

  • GDI32.dll – графика и вывод текста;

  • AdvAPI32.dll –функции для защиты объектов, работы с реестром и регистрации событий.

Библиотеки DLL функционируют в адресном пространстве приложения, загрузившего их, разделяя единую копию кода со всеми другими приложениями, использующими данную DLL. Приложения используют неявную (статическую) и явную (динамическую) загрузку DLL.

При неявной загрузке, в объявлении процедуры из внешней DLL включено ключевое слово external и имя DLL. В этом случае приложение пытается загрузить DLL до того, как будет вызван метод Application.Initialize, то есть до того, как приложение начнет выполняться.

При явной загрузке DLL, она будет загружаться в адресное пространство процесса в тот момент, когда будет вызван метод LoadLibrary.

Явная загрузка DLL требует от программиста большей аккуратности, но при этом сокращается время запуска приложения. Неявная загрузка DLL проще, так как при этом ОС Windows выполняет большую часть работы.

8.2.1 Создание dll

Рассмотрим создание DLL на следующем примере:

Требуется создать динамически загружаемую библиотеку mess.dll, которая содержит:

  1. процедуру HelloFromLib. Данная процедура выводит на экран число, переданное из приложения.

  2. функцию fy=xn. Причем, x и n передаются как параметры.

Для создания DLL необходимо выполнить следующие действия:

  1. В главном меню DELPHI последовательно выбираем пункты меню File|New|Other и в раскрывшемся диалоговом окне выбираем пункт для проекта “DLL Wizard”.

  2. На экране появляется исходный код файла с расширением .DPR. Наберите следующий код:

library mess;

uses

SysUtils,

Classes,

Dialogs;

{$R *.res}

Procedure HelloFromLib(k:Integer);

begin

ShowMessage('Вы передали число - '+IntToStr(k));

end;

function fy(x:Real;n:Integer):Real;

Var i:Integer;

y:Real;

begin

y:=1;

For i:=1 to n do

y:=y*x;

fy:=y;

end;

exports HelloFromLib,fy;

begin

end.

Примечание:

  1. в раздел uses добавлен модуль Dialogs, в котором содержится процедура ShowMessage

  2. В разделе export указан список экспортируемых процедур