Главная страница
Навигация по странице:

  • TScreen

  • GlobalMemoryStatus

  • GetWindowsDirectory

  • GetSystemDirectory

  • Определение конфигурации компьютера на языке высокого уровня


    Скачать 73.5 Kb.
    НазваниеОпределение конфигурации компьютера на языке высокого уровня
    Дата05.12.2021
    Размер73.5 Kb.
    Формат файлаdoc
    Имя файлаLaboratornaja_rabota_8 (TASK 8).doc
    ТипЛабораторная работа
    #292293

    Лабораторная работа № 8


    Тема: Определение конфигурации компьютера на языке высокого уровня.

    Задание: Разработать программу, которая определяет конфигурацию ПК на языке Borland Delphi.
    Методические указания к выполнению задания

    Разработаем программу, показывающую нам некоторую системную информацию о компьютере. В частности, хотелось бы получить информацию о версии ОС, ее директориях, свойствах экрана, ресурсах памяти, имени пользователя и компьютера, дате BIOS.

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

    Рассмотрим текст программы. В список включаемых модулей uses добавим registry. Добавим описание процедур в раздел public описания TfmMain.

    type

    TfmMain = class(TForm)

    ...

    procedure FormCreate(Sender: TObject);

    procedure Change(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    KeyboardDelay,

    KeyboardSpeed,

    ScreenSaveTimeOut : integer;

    procedure BIOSInfo(OS : string);

    procedure HardwareInfo;

    procedure MemoryInfo;

    procedure VideoInfo;

    procedure OSInfo;

    end;
    var fmMain: TfmMain;
    implementation

    uses Registry;

    {$R *.DFM}

    Сначала получим информацию о компьютере. Используем функцию GetComputerName для получения имени компьютера, функцию GetUserName для получения имени пользователя и функцию GetSystemInfo для получения информации о процессоре (наиболее полно данная функция реализована в Windows NT, где она возвращает и кол-во процессоров и их тип и т.д.).

    // Информация о компьютере.

    procedure TfmMain.HardwareInfo;

    var Size : cardinal;

    PRes : PChar;

    BRes : boolean;

    lpSystemInfo : TSystemInfo;

    begin

    // Имя компьютера

    Size := MAX_COMPUTERNAME_LENGTH + 1;

    PRes := StrAlloc(Size);

    BRes := GetComputerName(PRes, Size);

    if BRes then laCompName_.Caption := StrPas(PRes);

    // Имя пользователя

    Size := MAX_COMPUTERNAME_LENGTH + 1;

    PRes := StrAlloc(Size);

    BRes := GetUserName(PRes, Size);

    if BRes then laUserName_.Caption := StrPas(PRes);

    // Процессор

    GetSystemInfo(lpSystemInfo);

    laCPU_.Caption := 'класса x' + IntToStr(lpSystemInfo.dwProcessorType);

    end;

    Перейдем к параметрам экрану. Здесь мы будем использовать и Win32 API функции и стандартные объекты VCL. Так для получения разрешения экрана нам понадобится объект TScreen (его свойства Width и Height). Остальные параметры мы получим через контекст драйвера устройства DC используя функцию GetDeviceCaps.

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

    procedure TfmMain.VideoInfo;

    var DC : hDC;

    c : string;

    begin

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

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

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

    // Информация о глубине цвета.

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

    laBitsPerPixel_.Caption := IntToStr(GetDeviceCaps(DC,BITSPIXEL));

    laPlanes_.Caption := IntToStr(GetDeviceCaps(DC,PLANES));

    case GetDeviceCaps(DC,BITSPIXEL) 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;

    laColors_.Caption := c;

    DeleteDC(DC);

    end;

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

    // Информация о памяти.

    procedure TfmMain.MemoryInfo;

    var lpMemoryStatus : TMemoryStatus;

    begin

    lpMemoryStatus.dwLength := SizeOf(lpMemoryStatus);

    GlobalMemoryStatus(lpMemoryStatus);

    with lpMemoryStatus do begin

    laFreeMemory.Caption := laFreeMemory.Caption + IntToStr(dwMemoryLoad) + '%';

    laRAM_.Caption := Format('%0.0f Мбайт',[dwTotalPhys div 1024 / 1024]);

    laFreeRAM_.Caption := Format('%0.3f Мбайт',[dwAvailPhys div 1024 / 1024]);

    laPF_.Caption := Format('%0.0f Мбайт',[dwTotalPageFile div 1024 / 1024]);

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

    end;

    end;

    Узнаем информацию о ОС. Функция GetWindowsDirectory вернет путь к каталогу, где установлена система, функция GetSystemDirectory - к системному каталогу. Для определения версии ОС воспользуемся функцией GetVersionEx.

    // Информация о Windows.

    procedure TfmMain.OSInfo;

    var PRes : PChar;

    Res : word;

    BRes : boolean;

    lpVersionInformation : TOSVersionInfo;

    c : string;

    begin

    // Каталог, где установлена Windows

    PRes := StrAlloc(255);

    Res := GetWindowsDirectory(PRes, 255);

    if Res > 0 then laWinDir_.Caption := StrPas(PRes);

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

    Res := GetSystemDirectory(PRes, 255);

    if Res > 0 then laSysDir_.Caption := StrPas(PRes);

    // Имя ОС

    lpVersionInformation.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);

    BRes := GetVersionEx(lpVersionInformation);

    if BRes then

    with lpVersionInformation do case dwPlatformId of

    VER_PLATFORM_WIN32_WINDOWS :

    if dwMinorVersion=0 then c := 'Windows 95' else c := 'Windows 98';

    VER_PLATFORM_WIN32_NT : c := 'Windows NT';

    VER_PLATFORM_WIN32s : c := 'Win 3.1 with Win32s'

    end;

    laVersion_.Caption := c;

    // Дата создания BIOS-а

    if c='Windows NT' then BIOSInfo('NT') else BIOSInfo('95');

    end;

    В предыдущем отрывке программы внимательный читатель заметил вызов функции BIOSInfo с параметром, характеризующем текущую ОС. Опишем эту функцию. Важно отметить, что способ получения информации о дате BIOS различен. Для NT получим информацию из реестра, а для Windows 95/98 из соответствующего участка памяти. Эти два способа взаимоисключаемы, так как у Windows 95/98 нет соответствующего раздела реестра, а прямой доступ к памяти в NT невозможен.

    // Информация о дате создания BIOS-а.

    procedure TfmMain.BIOSInfo(OS : string);

    var p : pointer;

    s : string[255];

    begin

    if OS='NT' then begin with TRegistry.Create do

    try RootKey := HKEY_LOCAL_MACHINE;

    if OpenKeyReadOnly('HARDWARE\DESCRIPTION\System')

    then laBIOSDate_.Caption := ReadString('SystemBiosDate')

    finally Free;

    end;

    end

    else try

    s[0] := #8;

    p := Pointer($0FFFF5);

    Move(p^,s[1],8);

    laBIOSDate_.Caption := copy(s,1,2) + '/' + copy(s,4,2) + '/' +copy (s,7,2);

    except laBIOSDate_.Caption := 'XX.XX.XXXX';

    end;

    end;

    И ,наконец, вызовем все эти процедуры при создании формы.

    // Вызов информационных процедур при создании формы.

    procedure TfmMain.FormCreate(Sender: TObject);

    begin

    HardwareInfo;

    MemoryInfo;

    VideoInfo;

    OSInfo;

    end;

    Внешний вид запущенной программы приведен на рисунке.

    Использование Delphi совместно c фунциями Microsoft Win32 API позволит программисту создать более функционально богатые и гибкие приложения.

    Для зачета работы сдать файл с программой (*.exe и исходники).


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