Создание приложений Windows с использованием средств интерфейса прикладного программирования Win API. Отчет о лабораторной работе по операционным системам 8
Скачать 264.47 Kb.
|
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования «Рязанский государственный радиотехнический университет имени В.Ф. Уткина» Кафедра «Информационная безопасность» Отчет О лабораторной работе по операционным системам №8 «Создание приложений Windows с использованием средств интерфейса прикладного программирования Win API » Выполнил: Студент гр. 042 Ерохин П.Е. Проверил: доц. Засорин С.В., ст. пр. Дудко И.С. Рязань 2022 2.2. Задание для выполнения к части 1 лабораторной работы Разработать приложение Windows, выполняющее следующие файловые операции: 2.2.1. На текущем диске в текущем каталоге создать каталожную структуру, которая использовалась в лабораторной работе № 2. 2.2.2. В текущем каталоге S1 создать файл с именем file1.txt и записать в него строку 'Текстовая строка'. (Рис. 1.1 и Рис. 1.2) Рис. 1.1 Каталожная структура Рис. 1.2 Содержимое файла ‘file1.txt’ 2.2.3. Прочитать содержимое файла file1.txt в память и вывести его на экран (Рис. 2). Рис. 2 Содержимое файла ‘file1.txt’ в байтовом представлении 2.2.4. Прочитать 8 байт из файла file1.txt, начиная с байта 5, и вывести их на экран (Рис. 3). Рис. 3 2.2.5. Добавить к концу файла file1.txt символьную строку 'Дополнительная строка' и вывести содержимое файла на экран (Рис. 4). Рис. 4.1 Содержимое файла Рис.4.2 Записанная в файле строка 2.2.6. Установить для файла file1.txt атрибуты "только чтение" и "скрытый" (Рис. 5.1). Рис. 5 Установка атрибутов «Скрытый» и «Только чтение» 2.2.7. Снять с файла file1.txt атрибут "скрытый" и изменить дату и время. (Рис. 6.1,6.2,6.3) Рис. 6.1 Снятие атрибута «Скрытый» Рис.6.2 Выбор даты и времени Рис.6.3 результат изменения 2.2.8. Переименовать файл file1.txt в текущем каталоге, дав ему имя file2.txt (Рис. 7). Рис. 7 Переименование файла 2.2.9. Переслать файл file2.txt из текущего каталога в подкаталог S2 и скопировать в S3. Прочитать содержимое S1, S2, S3 и отобразить его на экране. Рис. 8.1 Содержимое каталога S1 Рис. 8.2 Содержимое каталога S2 Рис. 8.3 Содержимое каталога S3 2.2.10. Создать в корневом каталоге диска запись с меткой тома 'LABEL'. Рис. 8.4 2.2.11. Найти в корневом каталоге диска запись с меткой тома и убедиться, что метка совпадает с заданной в п.2.2.10. 2.2.12. Средствами операционной системы изменить метку диска и проверить работу программы. Затем стереть метку и снова проверить выполнение программы (Рис. 9.1 и 9.2) Рис. 9.1 Измененная метка диска E: Рис. 9.2 Результат перепроверки выполнения работы программы Программный код. unit Unit8; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; Label1: TLabel; Label2: TLabel; DateTimePicker1: TDateTimePicker; DateTimePicker2: TDateTimePicker; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button11Click(Sender: TObject); function SetFileTime(handle:longint; var cTime, laTime, lwTime: FILETIME):longint; stdcall; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // 2.2.1 procedure TForm1.Button1Click(Sender: TObject); begin CreateDirectory('E:\OS\LR8\S1', nil); CreateDirectory('E:\OS\LR8\S1\S2', nil); CreateDirectory('E:\OS\LR8\S1\S2\S3', nil); CreateDirectory('E:\OS\LR8\S1\S2\S3\S4', nil); CreateDirectory('E:\OS\LR8\S1\S2\S3\S5', nil); CreateDirectory('E:\OS\LR8\S1\S2\S3\S6', nil); Button1.Enabled:= False; end; // 2.2.2 procedure TForm1.Button2Click(Sender: TObject); var MyFile: hFile; ReOpenBuff: TOFStruct; buffer: string; count: integer; begin // Создание файла MyFile:= OpenFile( 'E:\OS\LR8\S1\file1.txt', ReOpenBuff, OF_CREATE ); // Запись текстовой строки buffer:= 'Текстовая строка'; count:= length(buffer); _lwrite(MyFile, @buffer[1], count); _lclose(MyFile); Button2.Enabled:= False; end; // 2.2.3 procedure TForm1.Button3Click(Sender: TObject); var MyFile: hFile; buff: array[0..255] of char; dwBytesRead: DWORD; data: string; i: integer; begin // Открываем файл MyFile:= _lopen( 'E:\OS\LR8\S1\file1.txt', OF_READWRITE ); // читаем содержимое файла ReadFile(MyFile, buff, 256, dwBytesRead, nil); //ShowMessage(buff); _lclose(MyFile); // Отображение содержимого на экране data:= IntToHex(Ord(buff[0]), 2); for i:= 1 to 255 do begin data:= data + ' ' + IntToHex(ord(buff[i]), 2) end; ShowMessage(data); button3.Enabled:= false; end; // 2.2.4 procedure TForm1.Button4Click(Sender: TObject); var MyFile: hFile; dwPos: DWORD; buff: array[0..7] of char; dwBytesRead: DWORD; data: string; i: integer; begin // Открытие файла MyFile:= _lopen( 'E:\OS\LR8\S1\file1.txt', OF_READWRITE ); // Позиционирование на 5 байт dwPos:= SetFilePointer(MyFile, 5, nil, FILE_BEGIN); // Чтение ReadFile(MyFile, buff, 8, dwBytesRead, nil); _lclose(MyFile); // Вывод на экран data:= IntToHex(Ord(buff[i]), 2); for i:= 1 to 7 do begin data:= data + ' ' + IntToHex(Ord(buff[i]), 2); end; ShowMessage(data); ShowMessage(buff); button4.Enabled:= false; end; // 2.2.5 procedure TForm1.Button5Click(Sender: TObject); var MyFile: hFile; buffer: string; count: integer; dwPos: DWORD; dwBytesRead: DWORD; buff: array[0..50] of char; data: string; i: integer; begin MyFile:= _lopen( 'E:\OS\LR8\S1\file1.txt', OF_READWRITE ); // Позиционирование на конец файла dwPos:= SetFilePointer(MyFile, 0, nil, FILE_END); LockFile(MyFile, dwPos, 0, dwPos + dwBytesRead, 0); // Запись текстовой строки buffer:= 'Дополнительная строка'; count:= length(buffer); _lwrite(MyFile, @buffer[1], count); UnlockFile(MyFile, dwPos, 0, dwPos + dwBytesRead, 0); // Чтение dwPos:= SetFilePointer(MyFile, 0, nil, FILE_BEGIN); ReadFile(MyFile, buff, 51, dwBytesRead, nil); _lclose(MyFile); data:= IntToHex(Ord(buff[0]), 2); for i:= 1 to 50 do begin data:= data + ' ' + IntToHex(Ord(buff[i]), 2); end; ShowMessage(data); //ShowMessage(buff); button5.Enabled:= false; end; // 2.2.6 procedure TForm1.Button6Click(Sender: TObject); var MyFile: hFIle; begin MyFile:= _lopen( 'E:\OS\LR8\S1\file1.txt', OF_READWRITE ); SetFileAttributes( 'E:\OS\LR8\S1\file1.txt', FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_READONLY ); _lclose(MyFile); button6.Enabled:= false; end; { Функция замены времени создания (Дополнение к заданию 2.2.7) } function SetFileDateTime(FileName: string; NewDateTime: TDateTime): Boolean; var FileHandle: integer; FileTime: TFileTime; LFT: TFileTime; LST: TSystemTime; begin Result := False; try DecodeDate(NewDateTime, LST.wYear, LST.wMonth, LST.wDay); DecodeTime(NewDateTime, LST.wHour, LST.wMinute, LST.wSecond, LST.wMilliSeconds); if SystemTimeToFileTime(LST, LFT) then begin if LocalFileTimeToFileTime(LFT, FileTime) then begin FileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareExclusive); if SetFileTime(FileHandle, nil, nil, @FileTime) then Result := True; end; end; finally FileClose(FileHandle); end; end; // 2.2.7 procedure TForm1.Button7Click(Sender: TObject); var MyFile: hFile; begin MyFile:= _lopen( 'E:\OS\LR8\S1\file1.txt', OF_READWRITE ); SetFileAttributes( 'E:\OS\LR8\S1\file1.txt', FILE_ATTRIBUTE_READONLY ); _lclose(MyFile); { Изменение даты и времени создания файла } { Связываем время элемента, в котором указали дату, со вторым элементом, в котором указали время } DateTimePicker1.Time := DateTimePicker2.Time; { Меняем дату создания файла } if SetFileDateTime('E:\OS\LR8\S1\file1.txt', DateTimePicker1.DateTime) then ShowMessage('Дата и время создания файла: file1.txt изменены на пользовательские!') else ShowMessage('Файл: file1.txt защищен от изменений!'); end; // 2.2.8 procedure TForm1.Button8Click(Sender: TObject); var MyFile: hFile; buff: array[0..50] of char; dwBytesRead: DWORD; begin RenameFile( 'E:\OS\LR8\S1\file1.txt', 'E:\OS\LR8\S1\file2.txt' ); button8.enabled:= false; end; // 2.2.9 procedure TForm1.Button9Click(Sender: TObject); var MyFile: hfile; buff: array[0..511] of char; dwBytesRead: DWORD; dwPos: DWORD; data: string; i: integer; isFailed: bool; begin // Пересылка файла из S1 в S2 MoveFile( 'E:\OS\LR8\S1\file2.txt', 'E:\OS\LR8\S1\S2\file2.txt' ); CopyFile( 'E:\OS\LR8\S1\S2\file2.txt', 'E:\OS\LR8\S1\S2\S3\file2.txt', isFailed ); // Чтение содержимого S1, S2, S3 // S1 MyFile:= _lopen( 'E:\OS\LR8\S1', OF_READWRITE ); ReadFile(MyFile, buff, 512, dwBytesRead, nil); // Отображение data:= 'Содержимое S1:' + #10#13 + IntToHex(Ord(buff[0]), 2); for i:= 1 to 511 do begin data:= data + ' ' + IntToHex(Ord(buff[i]), 2); end; ShowMessage(data); _lclose(MyFile); // S2 MyFile:= _lopen( 'E:\OS\LR8\S1\S2', OF_READWRITE ); ReadFile(MyFile, buff, 512, dwBytesRead, nil); // Отображение data:= 'Содержимое S2:' + #10#13 + IntToHex(Ord(buff[0]), 2); for i:= 1 to 511 do begin data:= data + ' ' + IntToHex(Ord(buff[0]), 2); end; ShowMessage(data); _lclose(MyFile); // S3 MyFile:= _lopen( 'E:\OS\LR8\S1\S2\S3', OF_READWRITE ); ReadFile(MyFile, buff, 512, dwBytesRead, nil); // Отображение data:= 'Содержимое S3:' + #10#13 + IntToHex(Ord(buff[0]), 2); for i:= 1 to 511 do begin data:= data + ' ' + IntToHex(Ord(buff[0]), 2); end; ShowMessage(data); _lclose(MyFile); button9.Enabled:= false; end; // 2.2.10 procedure TForm1.Button10Click(Sender: TObject); begin SetVolumeLabel('E:\' + #0, 'LABEL'); button10.Enabled:= false; end; procedure TForm1.Button11Click(Sender: TObject); var VolumeName, FileSystemName : array [0..MAX_PATH-1] of Char; VolumeSerialNo : DWord; MaxComponentLength,FileSystemFlags: Cardinal; volume: string[5]; i: integer; begin // Получение информации о диске GetVolumeInformation('E:\', VolumeName, MAX_PATH, @VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, MAX_PATH); // Чтение метки диска volume:=''; for i := 0 to 4 do volume:=volume+VolumeName[i]; // Проверка на совпадение заданной и измененной метки диска if volume = 'LABEL' then ShowMessage('Метка диска успешно изменена!') else ShowMessage('Метка диска не изменена.'); button11.Enabled := false; end; end. 3.2.2. Разработать и выполнить приложение Delphi, в котором: с помощью функции GetSystemInfo() получить основную системную информацию об используемой ОС (Рис. 10.1): Рис. 10.1 с помощью функции GlobalMemoryStatus() проанализировать текущее состояние адресного пространства (Рис. 10.2): Рис. 10.2 с помощью функции VirtualQuery() получить детальную информацию о состоянии виртуального адресного пространства (Рис. 10.3): Рис. 10.3 Программный код. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const Sproc = 'Архитектура процессора %s'; SPIntel = 'Intel'; SpageSize = 'Размер страницы $%.8x байт'; SminAddr = 'Минимальный адрес приложения $%p'; SmaxAddr = 'Минимальный адрес приложения $%p'; SnumProcs= 'Количество процессоров %d'; SallocGra = 'Детализация распределения $%.8x байт'; SProcLev1 = 'Уровень процессора %s'; SIntel3 = '80386'; SIntel4 = '80486'; SIntel5 = 'Pentium'; SIntel6 = 'Pentium Pro'; SprocRev = 'Версия процессора %.4x'; SmemUse = 'Используемая память %d%%'; StotMem = 'Общая физическая память $%.8x байт'; SfreeMem = 'Свободная физическая память $%.8x байт'; StotPage = 'Общая память файла подкачки $%.8x байт'; SfreePage = 'Свободная память для файла подкачки $%.8x байт'; StotVirt = 'Общая виртуальная память $%.8x байт'; SfreeVirt = 'Свободная виртуальная память $%.8x байт'; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; ms: TMemoryStatus; si: SYSTEM_INFO; lpBuffer: TMemoryBasicInformation; implementation {$R *.dfm} // Процедура получения системной информации procedure TForm1.Button1Click(Sender: TObject); begin GetSystemInfo(si); Memo1.Lines.Clear(); // Заполнение полей с системной информацией Memo1.Lines.Add(Format(SProc, [SPIntel])); Memo1.Lines.Add(Format(SPageSize, [si.dwPageSize])); Memo1.Lines.Add(Format(SMinAddr, [si.lpMinimumApplicationAddress])); Memo1.Lines.Add(Format(SMaxAddr, [si.lpMaximumApplicationAddress])); Memo1.Lines.Add(Format(SNumProcs, [si.dwNumberOfProcessors])); Memo1.Lines.Add(Format(SAllocGra, [si.dwAllocationGranularity])); case si.wProcessorLevel of 3: Memo1.Lines.Add(Format(SProcLev1, [SIntel3])); 4: Memo1.Lines.Add(Format(SProcLev1, [SIntel4])); 5: Memo1.Lines.Add(Format(SProcLev1, [SIntel5])); 6: Memo1.Lines.Add(Format(SProcLev1, [SIntel6])); else Memo1.Lines.Add(Format(SProcLev1, [IntToStr (si.wProcessorLevel)])); end; end; // Процедура определения текущего состояния памяти procedure TForm1.Button2Click(Sender: TObject); begin ms.dwLength:= SizeOf(ms); GlobalMemoryStatus(ms); Memo1.Lines.Clear(); // Заполнение полей информацией о состоянии памяти Memo1.Lines.Add(Format(SMemUse, [ms.dwMemoryLoad])); Memo1.Lines.Add(Format(STotMem, [ms.dwTotalPhys])); Memo1.Lines.Add(Format(SFreeMem, [ms.dwAvailPhys])); Memo1.Lines.Add(Format(STotPage, [ms.dwTotalPageFile])); Memo1.Lines.Add(Format(SFreePage, [ms.dwAvailPageFile])); Memo1.Lines.Add(Format(STotVirt, [ms.dwTotalVirtual])); Memo1.Lines.Add(Format(SFreeVirt, [ms.dwAvailVirtual])); end; // Процедура получения детальной информации о состоянии // виртуального адресного пространства procedure TForm1.Button3Click(Sender: TObject); begin VirtualQuery(si.lpMinimumApplicationAddress, lpBuffer, ms.dwTotalVirtual); Memo1.Lines.Clear(); // Заполнение полей Memo1.Lines.Add('Атрибут защиты: ' + IntToHex(lpbuffer.AllocationProtect, 8)); Memo1.Lines.Add('Суммарный размер группы страниц: ' + IntToHex(lpbuffer.RegionSize, 8)); Memo1.Lines.Add('Состояние страниц: ' + IntToHex(lpbuffer.State, 8)); Memo1.Lines.Add('Защита страниц: ' + IntToHex(lpbuffer.Protect, 8)); Memo1.Lines.Add('Тип физической памяти: ' + IntToHex(lpbuffer.Type_9, 8)); end; end. Задание для выполнения к части 3 лабораторной работы Для приведенного примера изучите текст основной процедуры, разработайте форму и выполните соответствующее приложение (Рис. 11). Рис. 11 Программный код. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; ListBox1: TListBox; Label1: TLabel; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); const PredefinedClipboardNames: array[1..17] of string = ('CF_TEXT', 'CF_BITMAP', 'CF_METAFILEPICT', 'CF_SYLK', 'CF_DIF', 'CF_TIFF', 'CF_OEMTEXT', 'CF_DIB', 'CF_PALETTE', 'CF_PENDATA', 'CF_RIFF', 'CF_WAVE', 'CF_UNICODETEXT', 'CF_ENHMETAFILE', 'CF_HDROP', 'CF_LOCALE', 'CF_MAX'); var FormatID: UINT; FormatName: array[0..255] of char; Len: Integer; begin // очищаю окно выхода // ListBox1.Items.Clear(); // Кол-во поддерживаемых форматов БО Label1.Caption:= 'Всего форматов доступно: ' + IntToStr(CountClipboardFormats); OpenClipboard(0); // Читаю первый формат БО FormatID:= EnumClipboardFormats(0); CloseClipboard; while (FormatID <> 0) do begin Len:= GetClipboardFormatName(FormatID, FormatName, 255); if Len = 0 then begin ListBox1.Items.Add(PredefinedClipboardNames[FormatID] + '(Предопределенный)' + '[' + IntToStr(FormatId) + ']'); end else begin ListBox1.Items.Add('FormatID: [' + IntToStr(FormatID) + ']'); FormatID:= EnumClipboardFormats(FormatID); end; end; CloseClipboard; end; end. |