Собираем информацию о компе.

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

Построим данную статью следующим образом:
1. Узнаем имя пользователя и компьютера
2. Информация о BIOS
3. Информация о центральном процессоре
4. Тип ПК
5. Получаем системные директории
6. Информация об ОС
7. Собираем инфу о принтерах
8. Информация о видеосистеме
9. Разбираемся с памятью
10. Мучаем сеть
11. Исследуем диски
12. Заключение

1. Узнаем имя пользователя и компьютера

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

Мне известны 3-и способа узнать имя пользователя и ПК:

Использование системного реестра Windows

Необходимую информацию можно посмотреть в следующих ключах:
HKEY_CURRENT_USER/Volatile Environment ключи USERNAME – имя пользователя и USERDOMAIN – имя ПК.

Однако в зависимости от системы (WinXP, 2000, Vista и др.) эти ключи могут отсутствовать. Выше приведенные ключи относятся к Vist’e. Для WinXP можно использовать следующие: для имени ПК – LOGONSERVER, а для имени пользователя HOMEPATH или USERPROFILE, но тут тебе придется вычислять имя пользователя (вытаскивать его из строки).
Небольшой пример можно посмотреть в листинге номер 1.

Листинг 1. Получаем имя пользователя и компьютера из реестра
Procedure GetNamesInfo;
var
MyReg: TRegistry;
RegPath: string;
begin
MyReg:=TRegistry.Create;
MyReg.Rootkey:=HKEY_CURRENT_USER;
RegPath:=’\Volatile Environment’;
MyReg.Openkey(RegPath, false);
ShowMessage(‘Имя пользователя: ’+MyReg.ReadString(‘USERNAME’));
ShowMessage(‘Имя ПК: ’+MyReg.ReadString(‘USERDOMAIN’));
end;
Возможно, есть и другие ключи в реестре, через которые можно узнать необходимую нам информацию. Можешь сам посмотреть, открыв реестр, а мы переходим к следующему способу.

Использование сетевых функций

Если ты когда–нибудь занимался программированием сокетов, то наверняка встречал такие функции как GetHostName и GetHostByAddr (кстати, данная функция присутствует также в PHP при программировании сокетов или, как говорят, сетевом программировании). Функция GetHostName в качестве параметров принимает имя буфера, в который будет записано имя ПК и размер буфера. Функцию GetHostByAddr пока оставим в покое (если кому интересно, можете почитать мануалы по программированию сокетов). Так, это были функции позволяющие узнать имя ПК. А как же имя пользователя? Если честно, то «прямых» функций, позволяющих узнать имя пользователя, я не встречал. Конечно, это не означает, что нет никакого способа узнать это, просто надо немного повозиться и сляпать свой алгоритм. Примеров приводить не будем, так как простой код будет мало понятен (пришлось бы отойти в сторону и рассказать немного о программировании сокетов, может в другой раз). Вместо этого переходим к заключительному способу.

Использование WinAPI функций GetComputerName и GetUserName

Данные функции предназначены для получения имени компьютера и имени пользователя соответственно. Они принимают по 2-а параметра: буфер и размер буфера. В результате в буфере мы получаем имя компьютера или пользователя (в зависимости от использованной функции). Пример использования функций приведен в листинге 2.

Листинг 2. Получаем имя пользователя и компьютера с помощью WinAPI
function UserName: string; //получаем имя пользователя
var
buf: array[0..MAX_COMPUTERNAME_LENGTH] of char;
sizebuf: dword;
begin
GetUserName(buf,sizebuf);
Result:=StrPas(buf);
end;
function CompName: string; //получаем имя компьютера
var
buf: array[0..MAX_COMPUTERNAME_LENGTH] of char;
sizebuf: dword;
begin
GetComputerName(buf,sizebuf);
Result:=StrPas(buf);
end;
В примерах мы объявили переменную buf как массив символов длинной от 0 до MAX_COMPUTERNAME_LENGTH (константа равная 15, объявлена в модуле Windows), т.е. размером в 16 символов и размер буфера sizebuf типа dword (тоже 16). В качестве дополнения упомяну функцию SetComputerName, которая служит для установки имени компьютера. В качестве параметра принимает новое имя компьютера.

2. Информация о BIOS

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

1. Использовать Assembler (этот способ сразу отпадает, мы пишем статью о Delphi, может в другой раз)
2. Второй способ распадается на 2-ва, это связано с ОС.
Итак, в Win 9x необходимую информацию можно узнать по фиксированному адресу в памяти $FFFF5.

Например:
infoBIOS: array[0..7] of char absolute $FFFF5;
Хочу заметить, что по фиксированным адресам можно узнать не только информацию о BIOS’e, но и о типе ПК, видео адаптере и другой аппаратуре). В WinXP, 2000, Vista информацию о BIOS’e можно узнать в реестре (жаль, но в NT системах мы не сможем получить прямой доступ к адресам, которые нам необходимы).

Итак данные берем здесь: HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System (в Vista есть еще ветка BIOS, там вся необходимая информация). Ключи VideoBiosDate – дата видео БИОС, SystemBiosDate – системная дата БИОС, SystemBiosVersion – версия БИОС. Небольшой пример приведен в листинге номер 3.

Листинг 3. Получаем информацию о BIOS
procedure GetBIOSInfo;
var
RegPath: string;
MyReg: TRegistry;
MyList: TStrings;
SysDateBios: string;
VersionBios: string;
VideoBios: string;
begin
MyReg:=TRegistry.Create;
MyReg.Rootkey:=HKEY_LOCAL_MACHINE;
RegPath:=’\HARDWARE\DESCRIPTION\System’;
MyList:=nil;
try
MyReg.Openkey(RegPath, false);
SysDateBios:=’Системная дата BIOS: ‘+MyReg.ReadString(‘SystemBiosDate’);
MyList:=ReadMultirowKey(MyReg,’SystemBiosVersion’);
VersionBios:=’Версия BIOS: ‘+MyList.Text;
VideoBios:=’Видео BIOS дата: ‘+MyReg.ReadString(‘VideoBiosDate’);
except ShowMessage(‘Ошибка доступа к системному реестру! Не могу прочитать данные’);
end;
MyReg.Free;
if Assigned(MyList) then
MyList.Free;
end;
Еще одна функция для считывания мультистрок из реестра (она не моя, я использовал уже готовый прототип) приведена в листинге 4.

Листинг 4. Ещё один способ получить информацию о BIOS
function ReadMultirowKey(reg: TRegistry; Key: string): TStrings;
const
bufsize = 100;
var
i: integer;
s1: string;
sl: TStringList;
bin: array[1..bufsize] of char;
begin
try
result := nil;
sl := nil;
sl := TStringList.Create;
if not Assigned(reg) then
raise Exception.Create(‘TRegistry object not assigned.’);
FillChar(bin, bufsize, #0);
reg.ReadBinaryData(Key, bin, bufsize);
i := 1;
s1 := »;
while i < bufsize do
begin
if ord(bin) >= 32 then
s1 := s1 + bin[i]
else
begin
if Length(s1) > 0 then
begin
sl.Add(s1);
s1 := »;
end;
end;
inc(i);
end;
result := sl;
except
sl.Free;
raise;
end;
end;
3. Информация о центральном процессоре

Далее будем пытать процессор. Посмотрим, что он нам скажет. Первый способ определения информации о процессоре (количество процессоров, сопроцессор, SSE, MMX, тип процессора и тд.) — это использование ассемблера, но нам он, как мы уже говорили, не подходит (не в этой статье). Второй способ — использование системного реестра Windows. Вот ветка: HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor (дальнейшие разделы – ветки зависят от количества установленных процессоров: 0 — это 1-ый процессор, 1 — это 2-ой процессор и тд.), (да, немного муторно проверять так количество процессоров и информацию по ним). Вот некоторые ключи, из которых можно почерпнуть необходимую нам информацию: ~MHz – частота процессора, Identifier – семейство, ProcessorNameString – имя процессора, тип, VendorIdentifier – производитель.
Небольшой пример приведён в листинге 5.

[i]Листинг 5. Получаем информацию о центральном процессоре
Procedure GetProcessorInfo;
var
MyReg: TRegistry;
RegPath: string;
begin
MyReg:=TRegistry.Create;
MyReg.Rootkey:=HKEY_LOCAL_MACHINE;
RegPath:=’\HARDWARE\DESCRIPTION\System\CentralProcessor’;
MyReg.Openkey(RegPath, false);
ShowMessage(‘Производитель: ’+MyReg.ReadString(‘VendorIdentifier’));
ShowMessage(‘Семейство: ’+MyReg.ReadString(‘Identifier’));
…………………………………………
end;
Третий способ – это использование Win API функции GetSystemInfo. Эта функция имеет один параметр, переменную типа TSystemInfo (это — структура (запись, говоря на языке Паскаль), производная от _SYSTEM_INFO, описание этой структуры я не буду приводить, если интересно, можешь посмотреть сам (нажми Ctrl и подведи курсор к TSystemInfo, кликни (дальше то же самое с _SYSTEM_INFO))). Итак, функция GetSystemInfo заполняет эту структуру и мы обращаясь затем к ней (структуре) получаем необходимые данные. Пример использования смотри в листинге 6.

Листинг 6. Получаем информацию о центральном процессоре (WinAPI)
procedure GetProcessorInfo;
var
ProcessInfo: TSystemInfo;
ProcCount: string;
ArchProc: string;
TypeProc: string;
begin
GetSystemInfo(ProcessInfo);
ProcCount:=’Количество процессоров: ‘+IntToStr(ProcessInfo.dwNumberOfProcessors);
ArchProc:=’Архитектура процессора: ‘+IntToStr(ProcessInfo.wProcessorArchitecture);
TypeProc:=’Тип процессора’+IntToStr(ProcessInfo.dwProcessorType);
end;
4. Тип ПК

Давай теперь попробуем узнать тип ПК. Каким образом мы это можем осуществить? Если у тебя Win 9х (не NT), то узнать необходимые данные не трудно, достаточно обратиться по адресу $FFFFE (если ты знаешь ассемблер, можете использовать его для определения типа ПК). Пример смотри в листинге 7.

Листинг 7. Получаем информацию о типе ПК в Win 9х.
var
typepc: byte absolute $FFFFE;
pc: string;
begin
case typepc of
$FC: pc:=’AT’;
$FD: pc:=’PCjr’;
$FE: pc:=’XT80’;
$FF: pc:=’PC’;
end;
pc:=’Немогу определить тип ПК’;
end;
В случае WinXP, 2000, Vista нужно использовать реестр, вот ветка: HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/SYSTEM, ключ Identifier. Смотри листинг 8.

Листинг 8. Получаем информацию о типе ПК в WinXP, 2000, Vista.
function CompIdent: string;
var
MyReg: TRegistry;
RegPath: string;
begin
MyReg:=TRegistry.Create;
MyReg.Rootkey:=HKEY_LOCAL_MACHINE;
RegPath:=’\HARDWARE\DESCRIPTION\System’;
MyReg.Openkey(RegPath, false);
Result:=’Тип компьютера: ‘+MyReg.ReadString(‘Identifier’);
end;
5. Получаем системные директории

Теперь попробуем найти директорию Windows и системную директорию. Не будем мудрить и рассказывать какие-то лишние и неуместные приемы реализации задуманного. Скажем просто, существует один очень простой и незамысловатый метод – это использование Win API функций. Итак, GetWindowsDirectory возвращает каталог Windows, GetSystemDirectory возвращает системный каталог. Эти 2-е функции принимают 2-а параметра: буфер (в нем и будет находиться необходимая нам информация после выполнения функции) и размер буфера. Пример использования функций находится в листинге 9.

Листинг 9. Получаем информацию о системных директориях.
//получаем системную директорию
function GetSysDirectory: string;
var
buf: array [0..255] of char;
bufsize: dword;
begin
GetSystemDirectory(buf,bufsize);
Result:=StrPas(buf)
end;
//получаем директорию Windows
function GetWinDirectory: string;
var
buf: array [0..255] of char;
bufsize: dword;
begin
GetWindowsDirectory(buf,bufsize);
Result:=StrPas(buf)
end;
6. Информация об ОС

От директорий к самой ОС. Попробуем узнать тип и версию Windows, для этого воспользуемся API функцией GetVersionEx (есть еще один способ — использование асма ), это — расширенная функция, позволяющая узнать более подробную информацию об ОС. Есть еще одна функция GetVersion, она позволяет узнать версию Windows и DOS. В старшем слове возвращает версию DOS’a, в младшем слове версию Windows). Пример в листинге 10.

Листинг 10. Получаем информацию об ОС
var
win, dos: word;
begin
win:=GetVersion and $0000FFFF;
dos:=GetVersion shr 16;
end;
Вернемся к функции GetVersionEx, она принимает один параметр – структуру TOSVersionInfo (для этой статьи правильно будет «запись», а не структура, но, в принципе, это — ведь одно и тоже, просто на Паскале принято такие вещи величать записью, а на Си структурами). Опишем эту структуру (запись):
DwVersionInfoSize: dword – заполняется перед вызовом функции (размер нашей структуры)
DwMajorVersion: dword – старшая цифра версии Windows (3 это WinNT 3.51, 4 это Win98, 95, Me, NT4.0 и 5 это WinXP, 2000, да 6-ка это Vista)
DwMinorVersion: dword – младшая цифра версии Windows (0 это Win95, 10 это Win98, 90 это Win Me, 51 WinNT 3.51, 0 это WinNT 4.0, 0 это Win 2000, 1 это WinXP)
DwBuildNumber: dword – номер билда
DwPlatformId: dword – платформа (VER_PLATFORM_WIN32s – Win3.1, VER_PLATFORM_WIN32 – Win9x, VER_PLATFORM_WIN32_NT – WinNT, 2000)
SzCSDVersion:dword – информация о сервис паке.
Пример использования функции смотри в листинге 11.

Листинг 11. Получаем информацию об ОС.
procedure GetOSInfo;
var
MyOS: TOSVersionInfo;
majorVer, minorVer: Integer;
begin
MyOS.dwOSVersionInfoSize:=sizeof(MyOS);
VersionOS:=’Неизвестная ОС’;
if GetVersionEx(MyOS) then
begin
majorVer := MyOS.dwMajorVersion;
minorVer := MyOS.dwMinorVersion;
case MyOS.dwPlatformId of
VER_PLATFORM_WIN32_NT :
begin
if majorVer <= 4 then
VersionOS:=’ОС Windows NT’
else
if (majorVer = 5) and (minorVer= 0) then
VersionOS:=’OC Windows 2000′
else
if (majorVer = 5) and (minorVer = 1) then
VersionOS:= ‘OC Windows XP’
else
VersionOS:=’Неизвестная ОС’;
end;
VER_PLATFORM_WIN32_WINDOWS :
begin
if (majorVer = 4) and (minorVer = 0) then
VersionOS:=’OC Windows 95′
else
if (majorVer = 4) and (minorVer = 10) then
begin
if MyOS.szCSDVersion[1] = ‘A’ then
VersionOS:=’OC Windows 98 SE’
else
VersionOS:=’OC Windows 98′;
end
else
if (majorVer = 4) and (minorVer = 90) then
VersionOS:=’OC Windows Me’
else
VersionOS:=’Неизвестная ОС’;
end;
else
VersionOS:=’Неизвестная ОС’;
end;
end
else
VersionOS:=’Неизвестная ОС’;
В качестве дополнения к этому пункту можно добавить информацию следующего плана: узнать откуда была установлена Windows – ветка в реестре HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Setup ключ SourcePath и ключ BootDir – загрузочный диск (т.е. диск с которого грузится винда, по умолчанию C:\), а также узнать установлен ли NetFrameWork, и какова его версия можно узнать из реестра по адресу HKEY_LOCAL_MACHINE/Software/Microsoft/.NETFrameWork/Policy.

7. Собираем инфу о принтерах

Всю необходимую информацию можно узнать из реестра: HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Print/Printers ключ DefaultSpoolDirectory – текущая директория спулера. Дальнейшие подветки будут являться «установленными принтерами». Ключи Name – имя принтера, Port – порт принтера, PrinterDriver – драйвер принтера. Второй способ — использование глобального объекта Printer. Пример можно глянуть в листинге 12.

Листинг 12. Получаем информацию о принтерах
procedure GetPrinterInfo;
var
MyReg: TRegistry;
RegPath: string;
List: TStringList;
i: integer;
printinfo: TStringList;
begin
MyReg:=TRegistry.Create;
//List:=nil;
List:=TStringList.Create;
printinfo:=nil;
printinfo:=TStringList.Create;
MyReg.Rootkey:=HKEY_LOCAL_MACHINE;
RegPath:=’\System\CurrentControlSet\Control\Print\Printers’;
MyReg.Openkey(RegPath, false);
MyReg.GetKeyNames(List);
MyReg.CloseKey;
for i:=0 to List.Count-1 do begin
MyReg.OpenKey(RegPath+’\’+List.Strings,false);
printinfo.Add(MyReg.ReadString(‘Name’));
printinfo.Add(MyReg.ReadString(‘Port’));
printinfo.Add(MyReg.ReadString(‘Printer Driver’));
end;
List.Free;
printinfo.Free;
end;
8. Информация о видеосистеме

Посмотрим информацию о видео системе. Некоторые данные, а именно разрешение экрана можно узнать при помощи глобального объекта Screen. Пример в листинге 13.

[i]Листинг 13. Получаем информацию о разрешении экрана.
var
x: string;
begin
X:=’Разрешение =’+IntToStr(Screen.Width)+’x’+ IntToStr(Screen.Height);
end;
Остальные данные получим через Win API функцию GetDeviceCaps и контекст драйвера HDC. Давайте рассмотрим все подробнее на примере в листинге 14.

Листинг 14. Получаем информацию о видеосистеме.
procedure GetVideoInfo;
var
DC: hdc;
mycolor: string;
col: string;
bitonpixel: string;
planesinfo: string;
ext: string;
begin
DC :=CreateDC(‘DISPLAY’,nil,nil,nil);
ext:=’Разрешение: ‘+IntToStr(Screen.Width)+’x’+IntToStr(Screen.Height);
bitonpixel:=’Бит на Пиксел: ‘+IntToStr(GetDeviceCaps(DC,BITSPIXEL));
planesinfo:=’Planes: ‘+IntToStr(GetDeviceCaps(DC,PLANES));
case GetDeviceCaps(DC,BITSPIXEL) of
8 : mycolor := ‘256 цветов’;
15 : mycolor := ‘Hi-Color / 32768 цветов’;
16 : mycolor := ‘Hi-Color / 65536 цветов’;
24 : mycolor := ‘True-Color / 16 млн цветов’;
32 : mycolor := ‘True-Color / 32 бит’;
end;
col:=’Цвета: ‘+mycolor;
DeleteDC(DC);
end;
В данном примере я упомянул и разрешение экрана, но это не важно, для нас важно другое — разобраться с GetDeviceCaps. Итак, в разделе переменных мы объявили DC (в нем будет указатель на полученное устройство) типа hDC. Далее при помощи функции CreateDC мы создаем «устройство» (или лучше сказать получаем контекст драйвера устройства), передав в качестве первого параметра DISPLAY (первый параметр — это указатель на драйвер), остальные три параметра мы опускаем, так как они для нас не нужны, заполняем nil’ами. Все, устройство получили, можно с ним работать. Здесь нам поможет как раз функция GetDeviceCaps, в качестве параметров он принимает указатель на устройство (в данном примере DC), и второй параметр — это число (так скажем, обозначающее те данные, которые мы хотим получить от этого устройства). Вместо чисел удобнее использовать символьные константы из модуля Windows, сам можешь посмотреть. Ну вот, в принципе, и все, из примера видно как использовать функцию. И да, по завершению работы удаляйте DC при помощи DeleteDC (см. пример).

9. Разбираемся с памятью

Вот мы и добрались до памяти. В этом пункте посмотрим информацию о физической и виртуальной памяти при помощи Win API функции GlobalMemoryStatus. Функция принимает один параметр – это структура TMemoryStatus. Сейчас давайте рассмотрим пример, а потом все разберем. Смотри листинг 15.

Листинг 15. Получаем информацию о виртуальной памяти.
procedure GetMemoryInfo;
var
MyMem: TMemoryStatus;
LoadMem: string;
AllMem: string;
FreeMem: string;
VirtMem: string;
FreeVirtMem: string;
begin
MyMem.dwLength:=SizeOf(MyMem);
GlobalMemoryStatus(MyMem);
with MyMem do begin
LoadMem:=’Загружено памяти: ‘+IntToStr(dwMemoryLoad) + ‘%’;
AllMem:=’Всего памяти: ‘+Format(‘%0.0f Мбайт’,[dwTotalPhys div 1024 / 1024]);
FreeMem:=’Осталось памяти: ‘+Format(‘%0.3f Мбайт’,[dwAvailPhys div 1024 / 1024]);
VirtMem:=’Виртуальная память: ‘+Format(‘%0.0f Мбайт’,[dwTotalPageFile div 1024 / 1024]);
FreeVirtMem:=’Осталось виртуальной памяти: ‘+Format(‘%0.0f Мбайт’,[dwAvailPageFile div 1024 / 1024]);
end;
end;
Давай разбираться. В разделе переменных мы объявили нашу структуру (MyMem) и другие вспомогательные переменные, в которые запишем необходимую информацию (количество памяти, свободно, загружено и др.). Далее перед вызовом GlobalMemoryStatus нам необходимо указать размер нашей структуры — dwLength и можно вызывать функцию. Все вызвали, в MyMem все данные которые нам нужны: (описание структуры)
DwMemoryLoad – загружено памяти (в процентах)
DwTotalPhys – всего оперативной памяти (в байтах)
DwAvailPhys – осталось оперативной памяти (в байтах)
DwTotalPageFile – всего виртуальной (файл подкачки) памяти (в байтах)
DwAvailPageFile – осталось виртуальной памяти (в байтах)
Ну, вот в принципе и все. Структуру я описал, остальное из примера видно, что и как. Для редактирования полученных данных использовалась функция Format (так как память то в байтах и ты получишь длинную цепочку циферек (ну в прочем какова оператива, такова и длина этой цепочки ).

10. Мучаем сеть

В этом пункте рассмотрим подключение к интернету и локальной сети. Каким образом можно определить подключение к сетям (локальным и глобальным)? Ну, тут способов много (естественно все их мы не рассмотрим, только основные). Итак, по порядку. Подключение к интернету:

Первый способ – это использование Indy компонента IdIPWatch c вкладки IndyMisc. Узнать подключен ли компьютер к интернету можно через свойство IsOnline (этого компонента), оно возвращает true если подключен и false в противном случае. А также узнать IP можно через свойство CurrentIP. P.S. Не забудьте установить свойство Active в true. Второй способ – использование функции InetIsOffline из библиотеки URL.dll. Третий способ – использование функции InternetGetConnectedState. Пример в листинге 16.

Листинг 16. Проверяем подключение к Интернету
const
MODEM=1;
LAN=2;
PROXY=3;
var
Con: dword;
begin
Con:=MODEM+LAN+PROXY;
If InternetGetConnectedState(@Con,0) then ShowMessage(‘Подключены’)
else ShowMessage(‘Не подключены’);
end;
При проверке подключения к локальной сети используем Win API функцию GetSystemMetrics. Пример в листинге 17.

Листинг 17. Проверяем подключение к локальной сети.
begin
if GetSystemMetrics(SM_NETWORK) and $01=$01 then ShowMessage(‘Обнаружено’)
else ShowMessage(‘Не обнаружено’);
end;
Все это будет работать (т.е. возвращать true) если установлена сетевая карта и она активна. Еще можно узнать информацию о сетевых картах, для этого надо заглянуть в реестр по адресу: HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/NetworkCards. Так же можно придумать массу своих методов для обнаружения подключений к сети.

11. Исследуем диски

И последнее, что мы рассмотрим в этой статье, – это диски (CD, Hard). Практически всю необходимую информацию можно узнать из Win API функции GetVolumeInformation. Функция принимает много параметров, поэтому рассмотрим все на примере (листинг 18).

Листинг 18. Исследуем диски.
procedure GetDiskInfo;
var
VolumeName, FileSystemName: array [0..MAX_PATH-1] of Char;
VolumeSerialNo: DWord;
MaxComponentLength,FileSystemFlags: Cardinal;
DiskInfo: TStrings;
begin
GetVolumeInformation(‘D:\’,VolumeName,MAX_PATH,@VolumeSerialNo,
MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH);
DiskInfo.Add(‘Метка тома: ‘+VolumeName);
DiskInfo.Add(‘Серийный номер: $’+IntToHex(VolumeSerialNo,8));
DiskInfo.Add(‘CompLen: ‘+IntToStr(MaxComponentLength));
DiskInfo.Add(‘Флаги файловой системы: $’+IntToHex(FileSystemFlags,4));
DiskInfo.Add(‘Файловая система: ‘+FileSystemName);
end;
DiskInfo.Free;
end;
Итак, функция принимает первым параметром имя диска (не забудь двоеточие и слеш), вторым параметром – буфер под метку тома, третий параметр – размер этого буфера (буфера метки тома, мы указали MAX_PATH (глобальную константу = не помню, по-моему 260)), четвертый параметр – это серийный номер (указываем соот. переменную), пятый параметр – это максимальная длина имени файла (если не ошибаюсь), шестой параметр – это флаги файловой системы, седьмой параметр – это буфер под имя файловой системы, и последний размер этого буфера. Фуф все. Думаю, из примера вам будет все ясно. Также есть еще функция для определения типа диска GetDriveType, которая принимает в качестве параметра имя диска (например, C:\) и возвращает:

0: если неизвестный диск
1: неверное имя диска
DRIVE_REMOVABLE: дискета
DRIVE_FIXED: FIXED
DRIVE_REMOTE: удаленный диск (сетевой)
DRIVE_CDROM: CD ROM
DRIVE_RAMDISK: RAM диск

12. Заключение

В завершении, наверное, стоит сказать, что это, конечно же, — не все данные (относительно нашего компьютера), которые мы можем получить. Можно еще расширять и раздувать статью по этому поводу вширь и поперек. Поэтому она остается не завершенной. Если ты увидел опечатки, ошибки, неточности или у тебя есть дополнения, пиши мне на почту, все учту.

Понравилась статья? Поделиться с друзьями: