Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Отображение адресного пространства процесса в объекты отображения



Следующий этап — выделение виртуального адресного пространства и отображе­ние его в файл через объект отображения. С точки зрения программиста, такое выде­ление памяти аналогично действию функции HeapAlloc, но намного грубее, более крупными частями. Возвращается указатель на выделенный блок (или образ файла); отличие состоит в том, что выделенный блок отображается в указанный пользовате­лем файл, а не в файл подкачки обмена. Объект отображения файла играет ту же роль, что и куча при использовании функции HeapAlloc.

lpvoidMapViewOfFile (HANDLE hMapObject, DWORD fdwAccess, DWORD dwOffsetHigh, DWORD dwOffsetLow, SIZE_T cbMap);

Возвращаемое значение: начальный адрес блока (образ файла) или NULL. при неудаче.

Параметры

hMapObject указывает объект отображения файла, полученный от функций CreateFileMapping или OpenFileMapping. Значение параметра fdwAccess должно соответствовать правам доступа объекта отображения. возможны три значения флагов:FILE_MAP_WRITE, FILE_MAP_READ и FILE_MAP_ALL_ACCESS (поразрядное "или" двух предыдущих флагов).

Параметры dwOffsetHigh и dwOffsetLow определяют начальное положение об­ласти отображения. Начальный адрес должен быть кратным 64К. Для отображения от начала файла используйте нулевое значение смещения.

cbMap указывает размер отображаемой области в байтах. Его нулевое значение при вы­зове функции MapViewOfFile указывает на то, что весь файл должен быть отображен.

Функция MapViewOfFileEx аналогична, за ис­ключением того, что необходимо указывать начальный адрес в памяти. Этот адрес, например, может быть адресом начала массива в области данных программы. При ус­пешном вызове этой функции Windows обеспечивает возможность использования данного базового адреса всеми процессами. Это значит, что виртуальное адресное про­странство заимствуется у всех процессов. В Windows 2000/NT возникает ошибка в случае, если процесс уже отобразил затребованное пространство.

Освобождение образа файла выполняется так же, как и освобождение памяти, вы­деленной в куче, т.е. функцией HeapFree..

BOOL UnmapViewOfFile (LPVOID lpBaseAddress)

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

Основная литература: [1] – 145- 158 c, [2] – 409-461 c.

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

  1. Преимущества применения отображаемых в память файлов.
  2. Стандартная последоватальность действий для отображения файлов
  3. Ограничения отображения файлов

[gl] Лекция 9. Тема: Динамические библиотеки [:]

В DLL содержатся все функции Windows API. Три самые важные DLL: Kernel32.dll (управление памятью, процессами и потоками), User32.dll (поддержка пользовательского интерфейса, в том числе, функции, связанные с созданием окон и передачей сообщений) и GDI32.dll (графика и вывод текста).

В Windows есть другие DLL:

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

ComDlg32.dll – стандартные диалоговые окна (вроде FileOpen и FileSave)

ComCtl32.dll – поддерживает стандартные элементы управления

DLL нужно применять для реализации следующих возможностей:

  1. Расширение функциональности приложения.
  2. Возможность использования разных языков программирования.
  3. Более простое управление проектом.
  4. Экономия памяти..
  5. Разделение ресурсов..
  6. Упрощение локализации.
  7. Решение проблем, связанных с особенностями различных платформ..
  8. Реализация специфических возможностей.

DLL и адресное пространство процесса.

DLL представляет собой набор модулей исходного кода, в каждом их которых содержится определенное число функций, вызываемых приложением или другим DLL. Причем в DLL обычно нет кода, предназначенного для обработки циклов выборки сообщений и создания окон.

Файлы с исходным кодом компилируются и компонуются также, как и при создании EXE-файла, но при компоновке нужно указать ключ /DLL.

Чтобы приложение (или другая DLL) могла вызывать функции, содержащиеся в DLL, образ ее файла нужно сначала спроецировать на адресное пространство вызывающего процесса. Это выполняется за счет неявного связывания при загрузке, либо за счет явного – в период выполнения. Теперь все функции DLL доступны всем потокам этого процесса. Когда поток вызывает из DLL какую-то функцию, та считывает свои параметры из списка потока и размещает в этом стеке собственные локальные переменные. Кроме того, любые созданные кодом объекты принадлежат вызывающему потоку или процессу DLL ничем не владеет.

При проецировании образа DLL-файла на адресное пространство процесса система создает также экземпляры глобальных и статических переменных.

Неявное связывание EXE – и DLL – модулей

Неявное связывание (implicit linking) - самый распространенный метод.

Исполняемый модуль (EXE) импортирует функции и переменные из DLL, а DLL– модулиэкспортирует их в исполняемый модуль. DLL – также может импортировать функции и переменные их других DLL.





Дата публикования: 2015-11-01; Прочитано: 696 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.005 с)...