- •Введение
- •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
8.3 Пример работы с dll
Рассмотрим работу с DLL на примере создания ловушки для перехвата нажатых клавиш
Рассмотрим использование ловушек для перехвата нажатых клавиш.
8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
Последовательность разработки DLL:
Создайте новый проект (File-New-DLL). Присвойте разрабатываемой DLL имя «Sendkey».
Запишите в DLL следующий программный код:
library SendKey;
uses Sysutils, Classes, Windows, Messages;
const
//пользовательские сообщения
wm_LeftShow_Event=wm_User + 133;
wm_RightShow_Event=wm_User + 134;
wm_UpShow_Event=wm_User +135;
wm_DownShow_Event=wm_User +136;
wm_Other_Event=wm_User +137;
var
SaveExitProc: Pointer;
// handle для ловушки
HookHandle: hHook = 0;
// собственно ловушка
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;
stdcall; export;
var
H:HWND;
begin
{если Code >= 0, то ловушка может обработать событие}
if (Code >= 0) and (lParam and $40000000 = 0) then
begin
//ищем окно приложения, которому DLL будет передавать сведения.
// Приложение ищется по имени класса и по заголовку
// Caption формы управляющей программы, который должен быть равен
//'XXX' !!!!
H:=FindWindow('TForm1', 'XXX');
// это те клавиши, которые отслеживаются?
case wParam of
VK_Left: SendMessage(H,wm_LeftShow_Event, 0, 0);
VK_Right: SendMessage(H,wm_RightShow_Event, 0, 0);
VK_Up: SendMessage(H,wm_UpShow_Event, 0, 0);
VK_Down: SendMessage(H,wm_DownShow_Event, 0, 0);
else SendMessage(H,wm_Other_Event, 0, wParam);
end;
// если 0, то система должна дальше обработать это событие, если 1 - нет
Result:=0;
end
else
if Code < 0
then { если Code < 0, то нужно вызвать следующую ловушку }
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
// при выгрузке DLL надо снять ловушку
procedure LocalExitProc; far;
begin
if HookHandle <> 0 then
begin
UnhookWindowsHookEx(HookHandle);
ExitProc:=SaveExitProc;
end;
end;
exports Key_Hook;
// инициализация DLL при загрузке ее в память
begin
//Создание ловушки, перехватывающей события клавиатуры
HookHandle:=SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
if HookHandle = 0 then
MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)
else
begin
SaveExitProc := ExitProc;
ExitProc := @LocalExitProc;
end;
end.
Откомпилируйте DLL
8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
Создайте проект (New Application), изображенный на рисунке 8.3).
Установите у объекта Form1 свойство Caption равным «ХХХ». Это необходимо потому, что DLL необходимо знать имя окна, которому передаются сообщения с помощью функции SendMessage.
Перенесите на форму компоненты, указанные в таблице 8.1.
Таблица 8.1 Визуальные компоненты приложения
№ |
Компонент |
Класс |
Описание |
1 |
Label1 |
TLabel |
Для вывода на экран кода очередной нажатой клавиши |
2 |
Button1 |
TButton |
Кнопка «Выход» |
Проверьте, включены ли в проект (в блоке uses) следующие библиотеки:
uses
WinTypes,WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
В блоке const опишите пользовательские сообщения:
Const
{ пользовательские сообщения }
wm_LeftShow_Event=wm_User + 133; {Клавиша влево}
wm_RightShow_Event=wm_User + 134; {Клавиша вправо}
wm_UpShow_Event=wm_User + 135; {Клавиша вверх}
wm_DownShow_Event=wm_User + 136; {Клавиша вниз}
wm_Other_Event=wm_User + 137; {Все остальные клавиши}
В блоке private выполните предварительное описание процедур обработки нажатых клавиш:
private
procedure WM_LeftMSG(Var M: TMessage); message wm_LeftShow_Event;
procedure WM_RightMSG(Var M: TMessage); message wm_RightShow_Event;
procedure WM_UpMSG(Var M: TMessage); message wm_UpShow_Event;
procedure WM_DownMSG(Var M: TMessage); message wm_DownShow_Event;
procedure WM_OtherMSG(Var M: TMessage); message wm_Other_Event;
end;
В блоке Var определите глобальную переменную P – указатель на функцию из DLL (Key_Hook)
var
Form1: TForm1;
P:Pointer;
В блоке implementation выполните загрузку DLL:
implementation
{$R *.DFM}
// Загрузка DLL
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;
stdcall; external 'SendKey.dll' name 'Key_Hook';
Выполните описание процедур:
procedure TForm1.WM_LeftMSG(Var M: TMessage);
begin
Label1.Caption := 'Left';
end;
procedure TForm1.WM_RightMSG(Var M: TMessage);
begin
Label1.Caption := 'Right';
end;
procedure TForm1.WM_UpMSG(Var M: TMessage);
begin
Label1.Caption := 'Up';
end;
procedure TForm1.WM_DownMSG (Var M : TMessage);
begin
Label1.Caption := 'Down';
end;
procedure TForm1.WM_OtherMSG(Var M: TMessage);
begin
Label1.Caption :=chr(M.LParam);
end;
Для компонента Form1 запрограммируйте событие OnCreate следующим образом:
procedure TForm1.FormCreate(Sender: TObject);
begin
{ если не использовать вызов процедуры из DLL в программе, то компилятор удалит загрузку DLL из программы }
P:=@Key_Hook;
end;
Откомпилируйте приложение и проверьте его работу.