
- •Введение
- •1. Лабораторная работа № 1
- •1.1. Цель работы
- •1.2. Теоретическое введение
- •1.2.1. Получение информации об операционной системе
- •1.2.2. Получение информации из реестра
- •1.2.3. Получение информации о системных каталогах Windows
- •1.2.4. Получение информации о диске
- •1.3. Создание приложения для получения характеристик компьютера и операционной системы
- •Контрольные вопросы
- •2. Лабораторная работа №2
- •2.1.Цель работы
- •2.2. Теоретическое введение
- •2.2.1. Процедуры и функции для работы с виртуальной памятью
- •2.3. Создание приложения, работающего с виртуальной памятью
- •2.4. Задание для самостоятельной работы
- •Контрольные вопросы
- •3. Лабораторная работа № 3
- •3.1. Цель работы
- •3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
- •3.3. Задания для самостоятельной работы
- •Контрольные вопросы
- •4. Лабораторная работа № 4
- •4.1. Цель работы
- •4. 2. Теоретическое введение
- •4.2.1 Создание или открытие объекта ядра «файла»
- •4.2.2 Создание объекта ядра «файл, проецируемый в память»
- •4.2.3 Проецирование файловых данных на адресное пространство процесса
- •4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
- •4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
- •4.3 Примеры программ, выполняющих проецирование в память
- •4.3.1 Пример 1
- •4.3.2 Пример 2
- •4.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •5. Лабораторная работа № 5
- •5.1.Цель работы
- •5.2. Теоретическое введение
- •5.2.1. Создание процесса
- •5.2.2. Запуск внешней программы функцией WinExec
- •5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute
- •При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
- •5.2.4. Создание потока
- •5.2.5. Завершение процесса
- •5.2.6. Завершение потока
- •5.2.7. Изменение класса приоритета процесса
- •5.2.8. Получение информации о классе приоритета процесса
- •5.2.9. Изменение уровня приоритета потока
- •5.2.10. Получение информации о приоритете потока
- •5.3. Примеры программ для работы с процессами и потоками
- •5.3.1. Создание процесса с помощью функции CreateProcess.
- •5.3.2. Создание процесса с помощью функции WinExec.
- •5.3.3. Создание процесса с помощью функции ShellExecute.
- •5.3.4. Создание многопоточного приложения.
- •5.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •6. Лабораторная работа № 6
- •6.1. Цель работы
- •6.2. Теоретическое введение
- •6.2.1. Получение «мгновенного снимка» системы
- •6.2.2. Получение информации о процессах
- •6.2.3. Получение информации о потоках
- •6.2.4. Получение информации о модулях
- •6.2.5. Информация о кучах (heap)
- •6.2.6. Информация о виртуальной памяти.
- •6.2.7. Алгоритм работы функций ToolHelp
- •6.2.8. Как получить карту памяти любого процесса
- •6.3. Пример использования функций ToolHelp
- •6.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •7. Лабораторная работа № 7
- •7.1. Цель работы
- •7.2. Теоретическое введение
- •7.2.1. Критические секции
- •7.2.2. Синхронизация с использованием объектов ядра
- •7.2.3. Wait-функции
- •7.2.4. Синхронизация с использованием процессов и потоков
- •7.2.5. Объекты Mutex
- •7.2.6. Семафоры
- •7.2.7. События
- •7.3 Примеры работы с объектами синхронизации
- •7.3.1 Пример 1
- •7.3.1 Пример 2
- •7.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •8. Лабораторная работа № 8
- •8.1. Цель работы
- •8.2 Теоретическое введение
- •8.2.1 Создание dll
- •8.2.2 Неявная загрузка dll
- •8.2.3 Явная загрузка dll
- •8.2.4 Внедрение dll в адресное пространство другого процесса
- •8.3 Пример работы с dll
- •8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
- •8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
- •8.4 Индивидуальные задания
- •Контрольные вопросы
- •9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
- •9.3. Пример работы системы уведомления об изменениях в файловой системе
- •9.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •214013 Г. Смоленск, Энергетический проезд, 1
9.3. Пример работы системы уведомления об изменениях в файловой системе
В качестве примера рассмотрим приложение, позволяющее выбрать любой каталог, а затем, с помощью функций FindFirstChangeNotification() и FindNextChangeNotification(), сообщить о следующих изменениях файловой системы в выбранном каталоге: создание, переименование или удаление файла.
Для создания приложения выполните следующие действия:
Создайте проект (New Application), экранная форма которого изображена на рисунке 9.1.
Перенесите на форму компоненты, указанные в таблице 9.3.
Введите глобальную переменную Dirname для хранения имени отслеживаемого каталога.
var
Form1: TForm1;
DirName:String;
Implementation
Таблица 9.3 Компоненты приложения для отслеживания изменений файловой системы
№ |
Компонент |
Описание |
1 |
2 |
3 |
1 |
Button1 |
Кнопка «Пуск». При нажатии на данную кнопку выбирается исследуемый каталог и запускается дополнительный поток для отслеживания изменений имен файлов в данном каталоге |
Продолжение таблицы 9.3
1 |
2 |
3 |
2 |
DriveComboBox1 (Страница Win3.1палитры компонентов) |
Компонент предназначен для выбора драйвера (диска) |
3 |
DirectoryListBox1(Страница Win3.1палитры компонентов) |
Компонент пердназначен для выбора каталога, в котором будут отслеживаться изменения файловой системы |
4 |
ListBox1 |
Дополнительный поток будет записывать в этот список содержимое каталога при обнаружении изменений. |
5 |
Label1 |
Метка «Выбор диска и каталога» |
6 |
Label2 |
Метка «Содержимое выбранного каталога» |
Для отслеживания изменений в каком-либо каталоге создайте дополнительный поток ChangeFS:
procedure changeFS;
var
r:Cardinal; {результат работы функции WaitForSingleObject }
fn:THandle; {дескриптор функции, отслеживающей изменение файловой системы}
Searchrec:TSearchRec; {Структура используется при поиске файлов}
Begin
// Сообщение ОС, о том, что приложение начинает отслеживать изменения
fn:=FindFirstChangeNotification(pchar(Dirname),True,FILE_NOTIFY_CHANGE_FILE_NAME);
repeat
// Ожидание изменений
r:=WaitForSingleObject(fn,2000);
If r=WAIT_OBJECT_0 then
Begin
// Если изменение произошло, на экран выводится новое содержимое каталога
Form1.ListBox1.Clear;
FindFirst(Form1.Edit1.text+'\*.*',faAnyFile,SearchRec);
repeat
Form1.ListBox1.Items.Add(Searchrec.Name);
until Findnext(Searchrec)<>0;
FindClose(SearChRec);
end;
// Если больше изменений не происходит, прервать процедуру отслеживания
If not FindNextChangeNotification(fn) then break;
until False;
FindCloseChangeNotification(fn);
end;
Для события OnChange компонента DriveComboBox1 запишите следующий программный код:
procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
DirectoryListBox1.Drive:= DriveComboBox1.Drive;
end;
Данный оператор предназначен для настройки свойства Drive компонента DirectoryListBox1 на выбранный с помощью компонента DriveComboBox1 диск.
Для события OnChange компонента DirectoryListBox1 запишите следующий программный код:
procedure TForm1.DirectoryListBox1Change(Sender: TObject);
begin
Dirname:=DirectoryListBox1.Directory;
end;
Данный оператор предназначен для сохранения в глобальной переменной Dirname выбранного каталога.
Для события OnCLick компонента DirectoryListBox1 запишите следующий программный код:
procedure TForm1.DirectoryListBox1Click(Sender: TObject);
begin
Dirname:=DirectoryListBox1.Directory;
end;
Данный оператор предназначен для сохранения в глобальной переменной Dirname выбранного каталога. Пункт 7 дублирует пункт 6 и не является обязательным.
Для события OnClick кнопки «Пуск» запишите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
pFunc:pointer;
ThreadID:CARDINAL;
hThread:THANDLE;
begin
// Запуск дополнительного потока для исследования
pFunc:=@ChangeFS;
hThread:=CreateThread(nil,0,pFunc,nil,0,ThreadID);
end;
Откомпилируйте приложение и проверьте его работу.