Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить название процессора в Delphi 11 без сторонних компонентов.

Delphi , ОС и Железо , Процессор

 

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

Способ 1: Чтение из реестра Windows

Самый простой способ получить название процессора - прочитать его из реестра Windows. Информация о процессоре хранится по следующему пути:

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0

Значение 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессор ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:49:45/0.0058588981628418/0