Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет ОС 1.doc
Скачиваний:
3
Добавлен:
26.09.2019
Размер:
301.57 Кб
Скачать

Создание приложения для получения характеристик компьютера и операционной системы.

Создали форму с перечисленными компонентами.

  1. Для события формы OnCreate записали следующий программный код:

procedure TForm1.FormCreate(Sender: TObject);

VAR

v:TOSVERSIONINFO;

reg:TRegistry;

a:Array[0..255] of Char;

begin

Edit1.Text:='C:\';

// Информация об операционной системе

v.dwOSVersionInfoSize:=Sizeof(OSVERSIONINFO);

GetVersionEx(v);

Edit6.Text:=IntToStr(v.dwMajorVersion)+'.'+IntToStr(v.dwMinorVersion);

Edit7.Text:=IntToStr(v.dwBuildNumber);

Edit8.Text:=v.szCSDVersion;

case v.dwPlatformId of

VER_PLATFORM_WIN32s: Edit9.Text:='Win32s on Windows 3.1.';

VER_PLATFORM_WIN32_WINDOWS: Edit9.Text:='Win32 on Windows 95.';

VER_PLATFORM_WIN32_NT: Edit9.Text:='Win32 on Windows NT.';

end;

// Определение, из какого каталога инсталлировалась Windows

reg:=TRegistry.Create;

reg.RootKey:=HKEY_LOCAL_MACHINE;

reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Setup',false);

Edit10.Text:=reg.ReadString('SourcePath');

reg.CloseKey;

reg.Free;

// Системные каталоги

GetSystemDirectory(@a,Sizeof(a));

Edit11.Text:=a;

GetWindowsDirectory(@a,Sizeof(a));

Edit12.Text:=a;

end;

  1. Для события формы OnClick кнопки «Получить» записали следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

VAR

SerialNum:DWORD;

a,b:DWORD;

Buffer,disk :Array[0..255]of char;

begin

StrPCopy(@disk,Edit1.text);

if GetVolumeInformation(@disk,Buffer,sizeof(Buffer),@SerialNum,a,b,nil,0) then

begin

Edit2.Text:=IntToStr(SerialNum);

Edit3.Text:=Buffer;

Edit4.Text:=IntToStr(a);

end;

end;

  1. Для получения тактовой частоты процессора включили в проект следующую функцию:

function GetCPUSpeed: Double;

const

DelayTime = 500;

var

TimerHi: DWORD;

TimerLo: DWORD;

PriorityClass: Integer;

Priority: Integer;

begin

PriorityClass := GetPriorityClass(GetCurrentProcess);

Priority := GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);

SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);

asm

DW 310Fh // rdtsc

MOV TimerLo, EAX

MOV TimerHi, EDX

end;

Sleep(DelayTime);

asm

DW 310Fh // rdtsc

SUB EAX, TimerLo

SBB EDX, TimerHi

MOV TimerLo, EAX

MOV TimerHi, EDX

end;

SetThreadPriority(GetCurrentThread, Priority);

SetPriorityClass(GetCurrentProcess, PriorityClass);

Result:=TimerLo/(1000.0 * DelayTime);

end;

  1. Для события формы OnClick кнопки «Определить» записали следующий программный код:

procedure TForm1.Button2Click(Sender: TObject);

begin

// Получение тактовой частоты процессора

Edit5.Text:=Format('CPU Speed: %f MHz',[GetCpuSpeed]);

end;

Работа проекта представлена на рисунке 2.

Рисунок 2

Текст программы:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,Registry;

type

TForm1 = class(TForm)

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

GroupBox3: TGroupBox;

Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Edit1: TEdit; Edit2: TEdit;

Edit3: TEdit; Edit4: TEdit; Button1: TButton; Edit5: TEdit; Button2: TButton; Label5: TLabel;

Label6: TLabel; Edit6: TEdit; Edit7: TEdit; Label7: TLabel; Label8: TLabel; Edit8: TEdit;

Edit9: TEdit; Label9: TLabel; Edit10: TEdit; Label10: TLabel; Edit11: TEdit; Label11: TLabel;

Edit12: TEdit;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

function GetCPUSpeed: Double;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

VAR

v:TOSVERSIONINFO;

reg:TRegistry;

a:Array[0..255] of Char;

begin

Edit1.Text:='C:\';

v.dwOSVersionInfoSize:=Sizeof(OSVERSIONINFO);

GetVersionEx(v);

Edit6.Text:=IntToStr(v.dwMajorVersion)+'.'+IntToStr(v.dwMinorVersion);

Edit7.Text:=IntToStr(v.dwBuildNumber);

Edit8.Text:=v.szCSDVersion;

case v.dwPlatformId of

VER_PLATFORM_WIN32s: Edit9.Text:='Win32s on Windows 3.1.';

VER_PLATFORM_WIN32_WINDOWS: Edit9.Text:='Win32 on Windows 95.';

VER_PLATFORM_WIN32_NT: Edit9.Text:='Win32 on Windows NT.';

end;

reg:=TRegistry.Create;

reg.RootKey:=HKEY_LOCAL_MACHINE;

reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Setup',false);

Edit10.Text:=reg.ReadString('SourcePath');

reg.CloseKey;

reg.Free;

GetSystemDirectory(@a,Sizeof(a));

Edit11.Text:=a;

GetWindowsDirectory(@a,Sizeof(a));

Edit12.Text:=a;

end;

procedure TForm1.Button1Click(Sender: TObject);

VAR

SerialNum:DWORD;

a,b:DWORD;

Buffer,disk :Array[0..255]of char;

begin

StrPCopy(@disk,Edit1.text);

if GetVolumeInformation(@disk,Buffer,sizeof(Buffer),@SerialNum,a,b,nil,0) then

begin

Edit2.Text:=IntToStr(SerialNum);

Edit3.Text:=Buffer;

Edit4.Text:=IntToStr(a);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Edit5.Text:=Format('CPU Speed: %f MHz',[GetCpuSpeed]);

end;

function Tform1.GetCPUSpeed: Double;

const

DelayTime = 500;

var

TimerHi: DWORD;

TimerLo: DWORD;

PriorityClass: Integer;

Priority: Integer;

begin

PriorityClass := GetPriorityClass(GetCurrentProcess);

Priority := GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);

SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);

asm

DW 310Fh

MOV TimerLo, EAX

MOV TimerHi, EDX

end;

Sleep(DelayTime);

asm

DW 310Fh

SUB EAX, TimerLo

SBB EDX, TimerHi

MOV TimerLo, EAX

MOV TimerHi, EDX

end;

SetThreadPriority(GetCurrentThread, Priority);

SetPriorityClass(GetCurrentProcess, PriorityClass);

Result:=TimerLo/(1000.0 * DelayTime);

end;

end.

Вывод по работе: изучили процедуры и функции Win32, позволяющие получить общую информации о характеристиках компьютера и операционной системы, создали приложение для их получения. Ознакомились с процессом разработки программы и трансляции ее с помощью ассемблера. Написали программу , которая выводит на экран 64 ASCII символа, начиная с символа пробела. Написали программу, которая выводит на экран строку сообщения «Hello, World!». Ознакомились с назначениями команд ассемблера, с работой командной строки ОС.