В этой статье я расскажу о нескольких способах получения названия процессора в Delphi 11 Alexandria без использования сторонних компонентов. Это может быть полезно для системной информации, логирования или отображения характеристик компьютера пользователя.
Способ 1: Чтение из реестра Windows
Самый простой способ получить название процессора - прочитать его из реестра Windows. Информация о процессоре хранится по следующему пути:
Значение ProcessorNameString содержит полное название процессора, которое отображается в окне "О системе" Windows.
Вот пример функции на Object Pascal для получения этой информации:
uses
System.SysUtils, Winapi.Windows, System.Win.Registry;
function GetCPUNameFromRegistry: string;
var
Reg: TRegistry;
begin
Result := '';
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly('\Hardware\Description\System\CentralProcessor\0') then
begin
Result := Reg.ReadString('ProcessorNameString');
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
Преимущества этого метода: - Простота реализации - Не требует дополнительных библиотек - Работает на всех версиях Windows
Недостатки: - Зависит от Windows (не будет работать на других ОС) - В редких случаях ключ реестра может быть недоступен
Способ 2: Использование инструкции CPUID
Альтернативный способ - использовать ассемблерную инструкцию CPUID, которая позволяет получить информацию о процессоре напрямую, без обращения к операционной системе.
Вот полный пример кода:
program GetCPUName;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TCPUID = packed record
rEAX: UInt32; { EAX Register }
rEBX: UInt32; { EBX Register }
rEDX: UInt32; { EDX Register }
rECX: UInt32; { ECX Register }
end;
function GetCPUID(Leaf, Subleaf: Integer): TCPUID;
asm
{$IF Defined(CPUX86)}
push ebx
push edi
mov edi, ecx
mov ecx, edx
cpuid
mov [edi+$0], eax
mov [edi+$4], ebx
mov [edi+$8], ecx
mov [edi+$c], edx
pop edi
pop ebx
{$ELSEIF Defined(CPUX64)}
mov r9,rcx
mov ecx,r8d
mov r8,rbx
mov eax,edx
cpuid
mov [r9+$0], eax
mov [r9+$4], ebx
mov [r9+$8], ecx
mov [r9+$c], edx
mov rbx, r8
{$ELSE}
{$Message Fatal 'GetCPUID has not been implemented for this architecture.'}
{$IFEND}
end;
function GetCPUNameByCPUID: String;
var
ExtPI : UInt32;
CpuName: array[0..47] of AnsiChar;
CPUID : TCPUID;
begin
Result := '';
FillChar(CpuName[0], 48, 0);
// Получаем максимальное поддерживаемое значение для расширенной информации
CPUID := GetCPUID($80000000, 0);
ExtPI := CPUID.rEAX;
// Читаем бренд процессора (три вызова CPUID)
if ExtPI >= $80000002 then
begin
CPUID := GetCPUID($80000002, 0);
Move(CPUID, CpuName[0], 16);
end;
if ExtPI >= $80000003 then
begin
CPUID := GetCPUID($80000003, 0);
Move(CPUID, CpuName[16], 16);
end;
if ExtPI >= $80000004 then
begin
CPUID := GetCPUID($80000004, 0);
Move(CPUID, CpuName[32], 16);
end;
Result := Trim(String(CpuName));
end;
begin
try
Writeln('CPU Name from Registry: ' + GetCPUNameFromRegistry);
Writeln('CPU Name from CPUID: ' + GetCPUNameByCPUID);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Преимущества этого метода: - Независимость от операционной системы - Работает даже если реестр недоступен - Более точная информация о процессоре
Недостатки: - Более сложная реализация - Требуется работа с ассемблером - Может не работать на некоторых старых процессорах
Сравнение методов
Характеристика
Реестр Windows
Инструкция CPUID
Простота реализации
Высокая
Низкая
Зависимость от ОС
Да
Нет
Точность информации
Зависит от ОС
Высокая
Совместимость
Только Windows
Все платформы
Производительность
Высокая
Очень высокая
Альтернативный способ: Использование WMI
Хотя в вопросе упоминалось решение без сторонних компонентов, стоит отметить, что Windows Management Instrumentation (WMI) предоставляет еще один способ получить информацию о процессоре. Для работы с WMI в Delphi есть встроенные компоненты.
Пример кода:
uses
System.SysUtils, Winapi.ActiveX, System.Win.ComObj;
function GetCPUNameFromWMI: string;
var
WMIServices: Variant;
WMIObjects: Variant;
WMIObject: Variant;
oEnum: IEnumVariant;
iValue: LongWord;
begin
Result := '';
try
WMIServices := GetActiveOleObject('winmgmts:\\localhost\root\cimv2');
WMIObjects := WMIServices.ExecQuery('SELECT Name FROM Win32_Processor');
oEnum := IUnknown(WMIObjects._NewEnum) as IEnumVariant;
if oEnum.Next(1, WMIObject, iValue) = 0 then
Result := WMIObject.Name;
except
on E: Exception do
Result := 'Error: ' + E.Message;
end;
end;
Этот метод требует инициализации COM (CoInitialize/CoUninitialize) и может быть менее надежным, чем первые два способа.
Заключение
Для большинства приложений на Delphi, работающих под Windows, достаточно простого чтения из реестра. Если же вам нужна кроссплатформенность или максимальная точность, стоит использовать инструкцию CPUID. WMI может быть полезен, когда требуется больше информации о системе, чем просто название процессора.
Выбор метода зависит от ваших конкретных требований к приложению. В простых случаях я рекомендую начинать с реестра, а при необходимости переходить к более сложным решениям.
Чтобы получить название процессора в Delphi 11 без сторонних компонентов, можно использовать чтение из реестра Windows, инструкцию CPUID или WMI.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS