Хотите прямо сейчас получить бесплатный видеокурс по программированию для начинающих?

Как узнать информацию о компьютере? (Delphi)

Май 16, 2012

Привет всем!

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

Речь пойдет о том как собрать информацию о системе. Особенно ту которая отличается на разных компьютерах. Её папках, местонахождении системных(и не очень) файлов, устройствах, и пр.
Этот урок я проведу в обычном текстовом виде, чтобы вы могли скопировать исходники и не париться по поводу ручного ввода.

Итак начнём.
Для начала объявим парочку констант:

const
folders = 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders';
WinVers = 'Software\Microsoft\Windows\CurrentVersion';

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

Еще нам понадобиться вот функция котой мы будем быстро и безболезненно извлекать информацию из реестра(Можете не париться с её реализацией):

function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string;
var
registry: TRegistry;
begin
//если Windows NT, открываем другой ключ
if ((GetVersion and $80000000)=0) and (Key_Open=WinVers) then
Key_Open:='SOFTWARE\Microsoft\Windows NT\CurrentVersion';
Registry := TRegistry.Create;
try
Registry.RootKey := Root_Key;
Registry.OpenKey(Key_Open, False);
Result := Registry.ReadString(Key_Read);
finally
Registry.Free;
end;
//если ничего не найдено, выводим "невозможно определить"
if Result<>EmptyStr then Result:=Key_read+': '+Result else Result:=Key_read+': невозможно определить';
end;

Код который будет далее можете вставить в любой обработчик:

Узнаем директорию Windows.
var
buffer:array [0..255] of char;
windir:string;
begin
GetWindowsDirectory(buffer, SizeOf(buffer));
windir:=buffer;
end;

Имя пользователя и версия ОС
var
OS,User:string;
begin
User:=WinInfo(HKEY_LOCAL_MACHINE,WinVers,'RegisteredOwner');
OS:=WinInfo(HKEY_LOCAL_MACHINE,WinVers,'ProductName');
end;

Пути к системным папкам
var
Desktop,Favorites,Fonts,AppData,Music,Pictures,Personal,Menu:string
begin
Desktop:=WinInfo(HKEY_CURRENT_USER,folders,'Desktop'); //Функция возвращает путь к папке рабочего стола
Favorites:=WinInfo(HKEY_CURRENT_USER,folders,'Favorites'); //Функция возвращает путь к папке c избранным
Fonts:=WinInfo(HKEY_CURRENT_USER,folders,'Fonts'); //Функция возвращает путь к папке со шрифтами
AppData:=WinInfo(HKEY_CURRENT_USER,folders,'Local AppData'); //Функция возвращает путь к системной папке AppData/Local/ Music:=WinInfo(HKEY_CURRENT_USER,folders,'My Music'); //Функция возвращает путь к папке с музыкой
Pictures:=WinInfo(HKEY_CURRENT_USER,folders,'My Pictures'); //Функция возвращает путь к папке с картинками
Personal:=WinInfo(HKEY_CURRENT_USER,folders,'Personal'); //Функция возвращает путь к папке с документами
Menu:=WinInfo(HKEY_CURRENT_USER,folders,'Start Menu'); //Функция возвращает путь к папке в которой находятся программы из меню пуск
end;

Получаем информацию о дисках(на форме должен быть компонент Memo1)
var
drive:string;
i:integer;
a: DWord;
SerialNum: PDWord;
buffer:array [0..255] of char;
begin
GetWindowsDirectory(buffer, SizeOf(buffer)); // заполняем buffer

//Получаем информацию о дисках
for i := 0 to 25 do
if (GetLogicalDrives and (1 shl i)) <> 0 then begin
Drive:=Char(Ord('A') + i) + ':\';
case GetDriveType(PChar(Drive)) of
DRIVE_REMOVABLE: Memo1.Lines.Add(Drive+' (гибкий диск)');
DRIVE_CDROM: Memo1.Lines.Add(Drive+' (CD-ROM)');
DRIVE_FIXED: begin
//находим серийный номер жесткого диска
new(SerialNum);
if getVolumeInformation(pChar(Drive),buffer,sizeof(buffer),SerialNum,a,a,nil,0) then
Memo1.Lines.Add(Drive+' (жесткий диск, S\N '+Inttostr(SerialNum^)+')');
end;
else Memo1.Lines.Add(Drive+' (неизвестный диск');
end;
end;
end;

В коде использован компонент Memo1. Вы при желании можете выводить куда угодно.

Информация о памяти(Также должен быть компонент memo1)
var
ms: TMemoryStatus
begin
GlobalMemoryStatus(MS);
Memo1.Lines.Add('Оперативная память: '+FormatFloat('#,###" KB"', MS.dwTotalPhys / 1024));
Memo1.Lines.Add('Свободно на жестком диске: '+FormatFloat('#,###" байт"',DiskFree(3)));
//"3" указывает на диск C:\
Memo1.Lines.Add('Объем жесткого диска: '+FormatFloat('#,###" байт"',DiskSize(3)));
Memo1.Lines.Add('');
end;

Фух… ну все. Если найдете ошибки — пишите в комментах.
До встречи!

компьютеры и комплектующие



3 Комментариев к записи Как узнать информацию о компьютере? (Delphi)

  1. Катя on 17.05.2012 at 01:27

    Артем! Здравствуйте!
    Огромное СПАСИБО Вам за Ваш ПОЛЕЗНЫЙ труд!
    Отдельная благодарность за урок по сбору
    информации о системе!
    Дай бог Вам здоровья, счастья, удачи и новых творческих ПОБЕД!

  2. Борис on 18.05.2012 at 08:18

    Большое спасибо !!!

  3. umenahonda on 18.05.2012 at 18:54

    Очень полезная информация. Я, правда отошол на какое-то время от делфи,(уже год им не занимался) (а как правильно, дельфи или делфи?)но чувствую, что как только снова встану обязательно обязательно воспользуюсь приведенной в этом уроке бесценной для начинающих и не только информацией. Себя, конечно, начинающим не считаю. Но все моменты делфи охватить невозможно никому. Поэтому такие уроки Артема очень нужны. Хочется его догнать в понимании программирования, но он все время опережает. Он двигается дальше. Я очень рад, что он еще занимается делфи, а не перешел на си ++ и вижуал майкрософт си ++, как сделали многие. Потому что считаю, что в делфи еще очень много интересных вещей есть, о которых мы не подозревааем, и которые ждут, чтобы в них разобрались.

Добавить комментарий для Борис Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Поддержите проект

Хит продаж:

Случайный анекдот

Моя вторая книга

Что это???

Программирование для Android:

Мы вконтакте

Помощь сайту

Понравился сайт? Он сильно нуждается в раскрутке.

Чтобы помочь в раскрутке - опубликуйте ссылку на сайт (или любую его страницу) на любом другом сайте в интернете. Тогда сайт станет чуточку популярнее.

Или просто нажмите на кнопки социальных сетей которые стоят в конце каждой статьи

Вместе мы сможем сделать программирование более популярным и более понятным для всех!

Заранее спасибо!
Артём Кашеваров.