11.17.1 Сведения о BIOS и видеокарте

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

Сведения об устройствах компьютера в Windows NT/2000/Me/XP хранятся в реестре. Например, сведения о BIOS материнской платы и о видеокарте хранятся в реестре в ключе Н KEY_LOCAL_MACH IN Е \ HARDWARE \ DESCRIPTION \ System. В этом ключе, в частности, хранятся следующие параметры:

Параметр

Тип

Описание

SystemBiosDate

строка

дата BIOS

J SystemBiosVersion

несколько строк

версия BIOS

I VideoBiosDate

стока

дата видеокарты

Тестовый пример, иллюстрирующий чтение подобной информации вы можете найти в проекте PInf на приложенном к книге диске. Окно этого приложения во время выполнения показано на рис. 11.9. На форме помещено окно RichEditl, в которое при щелчке на кнопке Button 1 заносится соответствующая информация.

Рис. 11.9

Приложение Plnf во время выполнения

11.17 Компьютер

Ниже приведены фрагменты кода этого приложения, относящиеся к информации о BIOS.

uses registry;
procedure TForml.ButtonlClick(Sender: TObject);
var reg: TRegistry;
buf: array[0..255] of char;
nchar, ic integer;
S: string;
P : pointers-begin // BIOS RichEditl.Clear;
RichEditl.SelAttributes.Style := [fsBold];
RichEditl.Lines.Add('BIOS');

RichEditl.SelAttributes := RichEditl.DefAttributes; if (GetVersion < $80000000) // Windows NT then begin

reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;

if reg.OpenKey('HARDWARE\DESCRIPTION\System1,false) then begin

RichEditl.Lines.Add('дата: 1 + reg.ReadString('SystemBiosDate1) ) ;
nchar := reg.ReadBinaryData(1SystemBiosVersion', buf, 256) - 1;
S := ";

for i:=0 to nchar do if buf[i] = #0 then S := S + ' ' else S := S + buf[i]; RichEditl.Lines.Add(1 версия: ' + §); end; end

// Windows 9.x else begin

S := ••;

try

P := Pointer($0ffff5); Move(PA, S[l], 8); except

S := 'BIOS недоступен для чтения';
end;
RichEditl.Lines.Add('дата: ' + S);
end;
// Видеокарта RichEditl.SelAttributes.Style := [fsBold];
RichEditl.Lines.Add('Видеокарта');

RichEditl.SelAttributes := RichEditl.DefAttributes ; if (GetVersion < $80000000) // Windows NT then begin

RichEditl.Lines.Add('дата : ' + reg.ReadString('VideoBiosDate')); reg.CloseKey; reg.Free; end

// Windows 9.x else begin

S : =

try

P := Pointer($0C0000 + 60); Move(P", S[l], 255); if Pos ( '/•, S) > 2 then S := copy(S, pos ( '/', S) - 2, 8) else begin P := Pointer ($0C0000 + 60 + 250); Move(PA, S[l], 255); if Pos ( '/', S) > 2

then S := copy(S, pos ( '/', S) - 2, 8) ; end; except

S := 'BIOS недоступен для чтения';
end;
RichEditl.Lines.Add('дата: ' + S) end;
end;

В данном примере предусмотрен вариант, работающий и для Windows 9.x. Эти версии Windows не хранят в реестре информацию о BIOS. Так что приходится пробовать читать ее непосредственно из BIOS. Поэтому в самом начале с помощью функции GetVersion (см. разд. 11.1) проверяется версия Windows. Если это NT/2000/XP, то чтение информации осуществляется из реестра. Особых пояснений этот код вряд ли требует, кроме, может быть, чтения версии BIOS. Параметр SystemBiosVersion имеет тип REGMULTISZ - мультистроковый. Это значит, что значение этого параметра может состоять из нескольких строк, разделенных нулевыми символами. Завершается значение двумя нулевыми символами. Чтение такого параметра методом ReadString приводит к генерации исключения. Так что читать его надо методом ReadBinaryData, обеспечивающим чтение любых двоичных данных. А дальнейшее зависит от того, что вы хотите делать с прочитанным значением. В приведенном примере значение переводится в строку с заменой всех нулевых символов пробелами.

Если версия Windows 9.x, то делается попытка читать информацию непосредственно из Bios. Но, к сожалению, может оказаться, что чтение символов из BIOS запрещено. В этом случае при попытке чтения функцией Move будет сгенерировано исключение. Тогда сработает оператор раздела except, сообщающий о невозможности прочитать информацию из BIOS.

Результат выполнения приведенного кода вы можете видеть на рис. 11.9 в верхней части окна редактирования.

11.16 Автозапуск приложений || Оглавление || 11.17.2 Процессор


Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Май
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс