Главная страница

Задание №1. Получение системной информации о компьютере Цель работы


Скачать 114.5 Kb.
НазваниеПолучение системной информации о компьютере Цель работы
Дата11.12.2020
Размер114.5 Kb.
Формат файлаdoc
Имя файлаЗадание №1.doc
ТипДокументы
#159572


Получение системной информации о компьютере
Цель работы: изучение средств получения системной информации о компьютере, работающего под управлением операционной системы из семейства Windows.
Теоретическая часть

Delphi располагает разнообразными средствами получения системной информации о компьютере (процессор, операционная система, монитор, клавиатура, память, процессы и др.). При необходимости можно обратиться к Microsoft Win32 API (Application Programming Interface - интерфейс взаимодействия прикладной программы с операционной системой). Почти все функции из Microsoft Win32 API описаны в модуле windows.pas (который по умолчанию включается в секцию uses новых модулей). Ниже описываются процедуры и функции, обеспечивающие доступ к системной информации, а также приводятся форматы структур данных, с помощью которых осуществляется передача этой информации.
Что такое Win API

Win API - это набор функций, предоставляемых операционной системой каждой программе. Эти функции находятся в стандартных динамически компонуемых библиотеках (Dynamic Linked Library, DLL), таких как kernel32.dll, user32.dll, gdi32.dll. В общем случае, каждая программа должна самостоятельно заботиться о том, чтобы подключить эти библиотеки, но в Delphi многие из этих функций уже описаны в соответствующих модулях, достаточно упомянуть их имена в разделе uses (например, большинство общеупотребительных функций описаны в модулях Windows и Messages).
Информация о системе
Разнообразные данные о системе (тип процессора, количество процессоров и т.п.) могут быть получены с помощью функция GetSystemInfo. Функция имеет один параметр типа TSystemInfo, который определяется следующим образом:
TSystemInfo = record

case Integer of

0: ( dwOemId: DWORD);

1: (wProcessorArchitecture: Word;

wReserved: Word;

dwPageSize: DWORD;

lpMinimumApplicationAddress: Pointer;

lpMaximumApplicationAddress: Pointer;

dwActiveProcessorMask: DWORD;

dwNumberOfProcessors: DWORD;

dwProcessorType: DWORD;

dwAllocationGranularity: DWORD;

wProcessorLevel: Word;

wProcessorRevision: Word);

end;
Поля записи типа TSystemInfo:

dwOemId - не используется для современных операционных систем (используется для Windows 95. Это поле всегда устанавливается равным нулю или значению PROCESSOR_ARCHITECTURE_INTEL);

wProcessorArchitecture - тип архитектуры используемого процессора.

Некоторые возможные значения для этого поля:

PROCESSOR_ARCHITECTURE_INTEL;

PROCESSOR_ARCHITECTURE_MIPS;

PROCESSOR_ARCHITECTURE_ALPHA;

PROCESSOR_ARCHITECTURE_PPC;

PROCESSOR_ARCHITECTURE_UNKNOWN.

wReserved - зарезервировано для использования в будущем;

dwPageSize - размер страницы памяти и определяет степень разбиения при защите и фиксации страниц. Например, на компьютерах Intel x86 это значение равно 4 Кб;

lpMinimumApplicationAddress - указатель на наименьший адрес памяти, доступный для приложения или DLL;

lpMaximumApplicationAddress - максимальный адрес памяти, доступный для приложения или DLL;

dwActiveProcessorMask - маска, представляющая сведения о наборе процессоров, сконфигурированных в системе. Бит 0 представляет первый процессор, а бит 31 – 32-й;

dwNumberOfProcessors - количество процессоров в системе;

dwProcessorType - тип процессора в системе (в настоящее время не актуально).

Возможные значения для этого поля:

PROCESSOR_INTEL_386;

PROCESSOR_INTEL_486;

PROCESSOR_INTEL_PENTIUM;

PROCESSOR_INTEL_PENTIUMII;

PROCESSOR_MIPS_R4000;

PROCESSOR_HITACHI_SH3;

PROCESSOR_HITACHI_SH4;

PROCESSOR_STRONGARM;

PROCESSOR_ARM720;

PROCESSOR_MIPS_R5000;

PROCESSOR_SHx_SH3DSP.
dwAllocationGranularity - размер выделяемого блока памяти (страницы). Для платформы Intel это значение равно 64 Кбайт;

wProcessorLevel - зависимый от архитектуры уровень процессора системы. Для платформы Intel соответствие значений поля и основных уровней процессора следующее:

3 - 80386;

4 - 80486;

5 - Pentium;

6 - Pentium Pro.

wProcessorRevision - более детальная информацию о процессоре, например, номер версии (трактовка зависит от типа).

Пример использования функции GetSystemInfo.

Следующая пользовательская функция определяет уровень процессора:

function GetProcessorLevel: String;

var SysInfo: TSystemInfo;

begin

GetSystemInfo(SysInfo);

Case SysInfo.wProcessorLevel of

3: Result:='80386';

4: Result:='80486';

5: Result:='Pentium';

6: Result:='Pentium Pro'

else Result:=IntToStr(SysInfo.wProcessorLevel);

end;

end;
Другой способ получения подробной информации о процессоре основан на анализе ключа реестра

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\nгде n - номер процессора (отсчет идет с 0).

В ключе есть ряд параметров:

-

MHz - тактовая частота в МГц (величина в целочисленном формате вида 3392);

- Identifier - тип процессора (строка вида "x86 Family 15 Model 3 Stepping 3");

- ProcessorNameString - наименование процессора (строка вида "Intel(R) Pentium(R) 4 CPU 2.80GHz");

- VendorIdentifier - идентификатор производителя (строка вида "GenuineIntel").
Примечание. Для вывода данных различных типов в Delphi может использоваться форматированный вывод. С помощью функции Format (из модуля SysUtils) можно форматировать простые типы данных в строке.

Объявление function Format (const sFormat: string; const Args: array of const) : string

Функция Format возвращает отформатированную строку, представляющую собой результат применения строки описания формата sFormat к открытому массиву аргументов Args.

Форматирующая строка sFormat может включать обычные символы (которые передаются неизменными в строку результата), и символы форматирования данных (спецификаторы). Каждый спецификатор формата соответствует как минимум одному из элементов списка аргументов и определяет, как именно рассматривать его и преобразовывать в строку. Спецификатор начинается с % и заканчивается индикатором типа данных:

  • d = Десятичное (целое число)

  • e = Научный (экспоненциальный)

  • f = С фиксированной точкой

  • g = Основной формат (обрезание незначащих нулей в конце)

  • m = Деньги

  • n = Действительное число (с плавающей точкой)

  • p = Указатель

  • s = Строка

  • u = Десятичное число без знака

  • x = Шестнадцатеричный

Спецификаторы формата и представляют собой следующие конструкции

 

"%" [index":"] ["-"] [width] ["."prec] type

где обозначены (квадратные скобки относятся к дополнительным (необязательным) параметрам):

• символ "%", с которого начинаются все спецификаторы формата (обязательный);

• [index":"] - определяет индекс аргумента в заданном списке Args, к которому относится данный спецификатор формата (необязательный);

• ["-"] - признак выравнивания по левому краю (необязательный);

• [width] - поле ширины (необязательный);

• ["."prec] - поле точности (необязательный);

• type - символ типа преобразования (обязательный).

 

Пример форматированного вывода для целой величины -123:

Label1.Caption:= Format('Decimal = %d', [-123]);

Пример форматированного вывода для указателя Px:

Label1.Caption:= Format('Pointer = %p', [Px]);

Пример форматированного вывода с указанием ширины и точности для переменной x:

Label1.Caption:= Format('Width + precision = <%9.4f>', [x]));
Состояние памяти
Информация о состоянии памяти компьютера может быть получена с помощью функции API GlobalMemoryStatus. Функция имеет один параметр типа TMemoryStatus. Тип TMemoryStatus определяет запись следующей структуры:

TMemoryStatus = record

dwLength: DWORD;

dwMemoryLoad: DWORD;

dwTotalPhys: DWORD;

dwAvailPhys: DWORD;

dwTotalPageFile: DWORD;

dwAvailPageFile: DWORD;

dwTotalVirtual: DWORD;

dwAvailVirtual: DWORD;

end;
Поля записи типа TMemoryStatus:

dwLength - длина записи TMemoryStatus.

Примечание. Поле необходимо инициализировать функцией SizeOf до обращения к функции GlobalMemoryStatus;

dwMemoryLoad - объем использованной памяти (в процентах);

dwTotalPhys - объем установленной на компьютере физической памяти (ОЗУ) (в байтах).

dwAvailPhys - объем свободной физической память (в байтах);

dwTotalPageFile - общий объем, который могут сохранить файлы/файл подкачки (в байтах);

dwAvailPageFile - доступный объем файла подкачки (в байтах);

dwTotalVirtual - общий объем виртуальной памяти, используемой в вызывающем процессе (в байтах);

dwAvailVirtual - объем виртуальной памяти, доступной для вызывающего процесса (в байтах).

Пример использования функции GlobalMemoryStatus.

Следующая пользовательская функция определяет объем установленной на компьютере физической памяти.

function GetTotalPhys: DWORD;

var MS: TMemoryStatus;

begin

MS.dwLength:=SizeOf(MS);

GlobalMemoryStatus(MS);

Result:=MS.dwTotalPhys;

end;
Функция GetTotalPhys возвращает объем физической памяти (в байтах), установленной на компьютере. Эти данные она получает из поля dwTotalPhys записи MS, имеющей тип TMemoryStatus. Все поля записи MS определяются при вызове API-функция GlobalMemoryStatus. Вызову функции GlobalMemoryStatus обязательно должна предшествовать инициализация поля dwLength с помощью функции SizeOf.

Аналогично выглядит пример процедуры, определяющей и отображающей доступный объем файла подкачки (в Мбайтах).

procedure TForm1.Button1Click(Sender: TObject);

var MS : TMemoryStatus;

begin

MS.dwLength := SizeOf(MS);

GlobalMemoryStatus(MS);

Label1.Caption := 'AvailPageFile:' +

Format('%0.0f Мбайт',[ MS.dwAvailPageFile div 1024 / 1024]);

end;
Примечание. С помощью функции GlobalMemoryStatus объем оперативной памяти (и другие параметры) определяется корректно, если он не превышает 4 Гбайт. При большем объеме следует использовать функцию GlobalMemoryStatusEx.

В Delphi 7 в модуле Windows.pas функция GlobalMemoryStatusEx не импортирована. Поэтому такой импорт из Kernel32.dll нужно выполнить самостоятельно:

function GlobalMemoryStatusEx(var lpBuffer : TMemoryStatusEx) : Bool; stdcall;

external 'Kernel32.dll' name 'GlobalMemoryStatusEx';

Тип TMemoryStatusEx также должен быть определен самостоятельно. Например так (назначение полей совпадает с TMemoryStatus):

type

TMemoryStatusEx = record

dwLength: DWORD;

dwMemoryLoad: DWORD;

dwTotalPhys: int64;

dwAvailPhys: int64;

dwTotalPageFile: int64;

dwAvailPageFile: int64;

dwTotalVirtual: int64;

dwAvailVirtual: int64;

dwAvailExVirtual: int64;

end;
Информация о видеосистеме
В приложении Delphi автоматически создается глобальный объект Screen (экран) типа TScreen, свойства которого определяются из информации Windows о мониторе, на котором запускается приложение. В любом приложении можно использовать, например, такие параметры объекта Screen, как Height — высота экрана и Width — его ширина (в пикселях). Разрешающую способность экрана можно определить, воспользовавшись свойством PixelsPerInch, указывающим количество пикселей экрана на дюйм в вертикальном направлении. Это справедливо именно для вертикального направления, поскольку во многих мониторах коэффициенты масштабирования по горизонтали и вертикали различаются.
Пример использования свойства Width и Height объекта Screen.
procedure Scr_W_H;

// Информация о видеосистеме

begin

// Разрешение экрана

H.Caption := IntToStr(Screen.Height);

W.Caption := IntToStr(Screen.Width);

end;
Эти же сведения (а также многие другие) можно получить через контекст драйвера устройства DC, используя функцию GetDeviceCaps. Контекст устройства (device context) - это структура, которая определяет набор графических объектов и связанных с ними атрибутов, а так же графических режимов, которые влияют на устройство вывода.

Функция GetDeviceCaps позволяет получить специфическую информацию о выбранном устройстве. Этим устройством может быть экран монитора, принтер, плоттер. Функция имеет два параметра:

DC - идентификатор контекста устройства (DC) (тип hDC). Контексты дисплея являются разновидностью контекста устройства, поэтому описатели контекста дисплея всегда хранятся в переменных типа hDC;

nIndex - возвращаемый элемент (тип integer). Устанавливает элемент для возврата. Этот параметр может иметь одно из ниже перечисленных значений (приведена часть параметров, характеризующих дисплей):

DRIVERVERSION - версия драйвера устройства;

TECHNOLOGY - технология устройства. Это может быть одно из ниже перечисленных значений:

DT_PLOTTER - векторный графопостроитель

DT_RASDISPLAY - растровый дисплей

DT_RASPRINTER -растровое печатающее устройство

DT_RASCAMERA - растровая камера

DT_CHARSTREAM - поток символов

DT_METAFILE - метафайл

DT_DISPFILE - дисплейный файл;

HORZSIZE - ширина, в миллиметрах, физического экрана;

VERTSIZE - высота, в миллиметрах, физического экрана;

HORZRES - ширина, в пикселях, экрана;

VERTRES - высота, в растровых строках, экрана;

LOGPIXELSX - число пикселей на логический дюйм по экранной ширине;

LOGPIXELSY - число пикселей на логический дюйм по экранной высоте;

BITSPIXEL - число битов цвета для представления одного пикселя;

PLANES - число цветовых плоскостей.
Контекст устройства можно создать с помощью функции CreateDC:

function CreateDC(DriverName, DeviceName, Output: PChar; InitData: Pointer): HDC;

Параметры:

DriverName - имя файла DOS (без расширения и заканчивающееся пустым символом) драйвера устройства;

DeviceName - имя конкретного поддерживаемого устройства (заканчивающееся пустым символом);

Output - выходной файл DOS или имя устройства (заканчивающееся пустым символом) (поддержка этого параметра осуществляется для совместимости с ранними версиями Windows);

InitData - структура TDevMode, содержащая данные инициализации конкретного устройства.

В случае успешного завершения - функция возвращает идентификатор контекста устройства; 0 - в противном случае.

Рассмотрим пример использования функции GetDeviceCaps для определения высоты экрана (в растровых строках).

procedure DisplayInfo;

var DC: hDC;

begin

DC:=CreateDC('DISPLAY',nil,nil,nil);

ShowMessage(IntToStr(GetDeviceCaps(DC, VERTRES)));

DeleteDC(DC);

end;

В разделе описания переменных предварительно необходимо объявить переменную DC (в ней будет указатель на полученное устройство) типа hDC. При помощи функции CreateDC получаем контекст драйвера устройства, передав в качестве первого параметра DISPLAY (первый параметр - это указатель на драйвер). Остальные три параметра должны иметь значение nil. Затем с помощью функции GetDeviceCaps определяем высоту экрана. Первым параметром функции будет указатель на устройство (DC), а вторым - VERTRES. Аналогичным образом могут быть получены другие характеристики дисплея. Когда контекст устройства больше не нужен, он может быть удален вызовом процедуры DeleteDC.

Функция GetDeviceCaps предоставляет возможность распознать организацию памяти видеоадаптера и число цветов, которые он может отобразить. Такой вызов данной функции возвращает число цветовых плоскостей:

iPlanes := GetDeviceCaps (DC, PLANES);

Следующий вызов возвращает число битов цвета для представления одного пикселя:

iBitsPixel = GetDeviceCaps (DC, BITSPIXEL);

Большинство графических устройств, способных отображать цвета, используют или множество цветных плоскостей или множество битов на пиксель, но не и то и другое сразу. Другими словами, один из указанных вызовов будет возвращать значение, равное 1. Число цветов, которые могут быть отображены видеоадаптером, вычисляется по формуле iPlanes * iBitsPixel.

Ниже приведен пример процедуры для определения количество цветов в системной палитре.

Procedure Get_Colors;

var

iColor: Integer;

DC: HDC;

c: string;

begin

DC := CreateDC('DISPLAY', nil, nil, nil);

if DC <> 0 then

begin

iColor := GetDeviceCaps(DC, BITSPIXEL) * GetDeviceCaps(DC, PLANES);

case iColor of

8 : c := '256 цветов';

15 : c := 'Hi-Color / 32768 цветов';

16 : c := 'Hi-Color / 65536 цветов';

24 : c := 'True-Color / 16 млн. цветов';

32 : c := 'True-Color / 32 бит';

end;

ShowMessage(c);

DeleteDC(DC);

end

else ShowMessage('Не удалось создать контекст устройства DISPLAY');

end;

Информация о мыши
С появлением графического интерфейса пользователя на персональных компьютерах механический манипулятор, преобразующий движение в управляющий сигнал (компьютерная мышь), получил чрезвычайно широкое распространение.

Информацию о мыши можно получить разными способами, например с помощью функции GetSystemMetrics.

Функция GetSystemMetrics возвращает системную метрику и системные параметры настройки конфигурации. Системная метрика – это размеры элементов отображения Windows. Функция имеет один параметр типа integer, определяющий системный показатель или настройку конфигурации, которая будет возвращена. При успехе, функция возвращает запрашиваемую системную метрику или конфигурационную установку. При ошибке возвращается ноль.

GetSystemMetrics(nIndex)

Параметр может иметь одно из ниже перечисленных значений (приведена часть параметров, относящихся к мыши):

SM_MOUSEPRESENT - возвращает 1, если мышь установлена, иначе 0;

SM_CMOUSEBUTTONS - определяет число кнопок на мыши (результат равен нулю, если мышь не установлена);

SM_MOUSEWHEELPRESENT - возвращает 1, если установлена мышь с колесиком, иначе 0;

SM_SWAPBUTTON - возвращает ненулевое значение, если значения левых и правых кнопок мыши меняются.
Информация о клавиатуре
Информацию о клавиатуре можно получить разными способами, например с помощью функции GetKeyboardType.

Функция GetKeyboardType получает информацию об используемой клавиатуре. Функция имеет один параметр типа integer, определяющий вид требуемой информации. При успехе, функция возвращает запрашиваемую затребованную информацию. При ошибке возвращается ноль.

GetKeyboardType (nTypeFlag)

Параметр может иметь одно из ниже перечисленных:

0 - тип клавиатуры;

1 - подтип клавиатуры;

2 - количество функциональных клавиш на клавиатуре.

Тип может иметь одно из последующих значений:

1 - IBM PC/XT или совместимая (83 клавиши) клавиатура;

2 - Olivetti "ICO" (102 клавиши) клавиатура;

3 - IBM PC/AT (84 клавиши) или сходная с ней клавиатура;

4 - IBM enhanced (101 или 102 клавиши) клавиатура;

5 - Nokia 1050 и сходная с ней клавиатура;

6 - Nokia 9140 и сходная с ней клавиатура;

7 - Японская клавиатура.

Подтип – это значение, соответствующего оригинальному производителю оборудования (OEM-зависимая величина).
Информация о подключении к сети
Часто требуется определить подключен ли компьютер к сетям (локальным и глобальным). Существует несколько способов решения этой задачи. Рассмотрим один из них.

При проверке подключения к локальной сети можно использовать рассматривавшуюся выше WinAPI функцию GetSystemMetrics, указав значение параметра равным SM_NETWORK. Тогда результат будет содержать 1 в младшем значащем бите возвращаемого значения при наличии сети. Все другие биты возвращаемого значения зарезервированы и не определены.

Пример использования функции GetSystemMetrics:

if GetSystemMetrics(SM_NETWORK) and $01 = $01 then

ShowMessage('Сеть обнаружена')

else

ShowMessage(Сеть не обнаружена');

Задание
Разработать приложение для получения полной информации о компьютере, на котором выполняется лабораторная работа. Предусмотреть получение и отображение данных о процессоре, памяти, видеосистеме, мыши, клавиатуре, сети.
Требования к отчету
Отчет должен содержать:

  • титульный лист;

  • задание;

  • описание использованных процедур и функций;

  • описание терминов (краткий словарь), используемых в лабораторной работе (физическая память, виртуальная память и т.п.);

  • текст разработанного проекта;

  • полученные сведения о компьютере;

  • список использованных источников.


написать администратору сайта