Pascal tSMBIOS 项目介绍:轻松读取系统管理 BIOS 信息
项目概述
tSMBIOS 是一个用 Pascal(Delphi/Free Pascal)编写的开源库,专门用于读取和解析计算机的 SMBIOS(System Management BIOS)信息。该项目由 RRUZ 开发并维护,为 Pascal 开发者提供了一个强大而便捷的工具来访问系统硬件信息。
核心功能
1. SMBIOS 数据结构解析
tSMBIOS 能够完整解析 SMBIOS 规范中定义的各种数据结构,包括: - 系统信息(制造商、型号、序列号) - 主板信息 - BIOS 信息 - 处理器详细信息 - 内存设备信息 - 端口和连接器信息
2. 跨平台支持
Windows(32位和64位)
Linux
macOS
3. 多种访问方式
通过操作系统 API 获取 SMBIOS 数据
直接从物理内存读取原始 SMBIOS 数据
支持 UEFI 和传统 BIOS 系统
安装与使用
安装方法
克隆项目到本地:
git clone https://github.com/RRUZ/tsmbios.git
在 Delphi 或 Lazarus 中添加路径:
将
tsmbios目录添加到库路径在项目中添加
uSMBIOS单元
基本使用示例
program SMBIOSDemo;
uses
SysUtils, uSMBIOS;
var
SMBios: TSMBios;
BIOSInfo: TBIOSInformation;
begin
// 创建 SMBIOS 对象
SMBios := TSMBios.Create;
try
// 获取 BIOS 信息
BIOSInfo := SMBios.BIOSInfo;
WriteLn('BIOS 供应商: ' + BIOSInfo.VendorStr);
WriteLn('BIOS 版本: ' + BIOSInfo.VersionStr);
WriteLn('BIOS 发布日期: ' + BIOSInfo.ReleaseDateStr);
WriteLn('BIOS 大小: ' + IntToStr(BIOSInfo.Size) + ' KB');
// 获取系统信息
WriteLn('系统制造商: ' + SMBios.SysInfo.ManufacturerStr);
WriteLn('系统型号: ' + SMBios.SysInfo.ProductNameStr);
WriteLn('系统序列号: ' + SMBios.SysInfo.SerialNumberStr);
finally
SMBios.Free;
end;
end.实际应用示例
示例 1:获取详细的处理器信息
procedure ShowProcessorInfo;
var
SMBios: TSMBios;
ProcessorInfo: TProcessorInformation;
i: Integer;
begin
SMBios := TSMBios.Create;
try
WriteLn('=== 处理器信息 ===');
for i := 0 to SMBios.ProcessorInfo.Count - 1 do
begin
ProcessorInfo := SMBios.ProcessorInfo[i];
WriteLn('处理器 ' + IntToStr(i + 1) + ':');
WriteLn(' 制造商: ' + ProcessorInfo.ManufacturerStr);
WriteLn(' 型号: ' + ProcessorInfo.ProcessorVersionStr);
WriteLn(' 核心数: ' + IntToStr(ProcessorInfo.CoreCount));
WriteLn(' 线程数: ' + IntToStr(ProcessorInfo.ThreadCount));
WriteLn(' 最大频率: ' + IntToStr(ProcessorInfo.MaxSpeed) + ' MHz');
WriteLn(' 当前频率: ' + IntToStr(ProcessorInfo.CurrentSpeed) + ' MHz');
WriteLn(' 插槽: ' + ProcessorInfo.SocketDesignationStr);
WriteLn('');
end;
finally
SMBios.Free;
end;
end;示例 2:获取内存设备信息
procedure ShowMemoryInfo;
var
SMBios: TSMBios;
MemoryInfo: TMemoryDeviceInformation;
i: Integer;
TotalMemory: Cardinal;
begin
SMBios := TSMBios.Create;
try
WriteLn('=== 内存信息 ===');
TotalMemory := 0;
for i := 0 to SMBios.MemoryDeviceInfo.Count - 1 do
begin
MemoryInfo := SMBios.MemoryDeviceInfo[i];
if MemoryInfo.Size > 0 then
begin
WriteLn('内存插槽 ' + MemoryInfo.DeviceLocatorStr + ':');
WriteLn(' 大小: ' + IntToStr(MemoryInfo.Size) + ' MB');
WriteLn(' 类型: ' + MemoryInfo.MemoryTypeStr);
WriteLn(' 频率: ' + IntToStr(MemoryInfo.Speed) + ' MHz');
WriteLn(' 制造商: ' + MemoryInfo.ManufacturerStr);
WriteLn(' 序列号: ' + MemoryInfo.SerialNumberStr);
WriteLn('');
TotalMemory := TotalMemory + MemoryInfo.Size;
end;
end;
WriteLn('总内存: ' + IntToStr(TotalMemory) + ' MB');
finally
SMBios.Free;
end;
end;示例 3:系统信息监控工具
unit SystemMonitor; interface uses Classes, SysUtils, uSMBIOS; type TSystemMonitor = class private FSMBios: TSMBios; function GetSystemInfo: string; function GetHardwareInfo: string; public constructor Create; destructor Destroy; override; function GenerateReport: string; end; implementation constructor TSystemMonitor.Create; begin inherited Create; FSMBios := TSMBios.Create; end; destructor TSystemMonitor.Destroy; begin FSMBios.Free; inherited Destroy; end; function TSystemMonitor.GetSystemInfo: string; begin Result := '系统信息:' + sLineBreak + '==========' + sLineBreak + '制造商: ' + FSMBios.SysInfo.ManufacturerStr + sLineBreak + '型号: ' + FSMBios.SysInfo.ProductNameStr + sLineBreak + '序列号: ' + FSMBios.SysInfo.SerialNumberStr + sLineBreak + 'UUID: ' + FSMBios.SysInfo.UUIDStr + sLineBreak; end; function TSystemMonitor.GetHardwareInfo: string; var i: Integer; begin Result := '硬件信息:' + sLineBreak + '==========' + sLineBreak; // BIOS 信息 Result := Result + 'BIOS:' + sLineBreak + ' 版本: ' + FSMBios.BIOSInfo.VersionStr + sLineBreak + ' 发布日期: ' + FSMBios.BIOSInfo.ReleaseDateStr + sLineBreak; // 主板信息 Result := Result + '主板:' + sLineBreak + ' 制造商: ' + FSMBios.BaseBoardInfo.ManufacturerStr + sLineBreak + ' 型号: ' + FSMBios.BaseBoardInfo.ProductStr + sLineBreak; // 处理器信息 Result := Result + '处理器:' + sLineBreak; for i := 0 to FSMBios.ProcessorInfo.Count - 1 do begin Result := Result + ' CPU' + IntToStr(i+1) + ': ' + FSMBios.ProcessorInfo[i].ProcessorVersionStr + sLineBreak; end; end; function TSystemMonitor.GenerateReport: string; begin Result := GetSystemInfo + sLineBreak + GetHardwareInfo; end; end.
高级特性
1. 原始数据访问
// 访问原始 SMBIOS 表 var RawData: TSmBiosTable; begin RawData := SMBios.RawSMBIOSData; // 直接处理原始数据 end;
2. 自定义解析
// 扩展自定义结构解析 type TCustomSMBIOS = class(TSMBios) public function GetCustomStructure: TCustomInfo; end;
3. 错误处理
try
SMBios := TSMBios.Create;
// 操作 SMBIOS 数据
except
on E: Exception do
WriteLn('读取 SMBIOS 时出错: ' + E.Message);
end;应用场景
系统信息工具开发:创建类似于 CPU-Z 的系统信息查看工具
资产管理软件:自动收集硬件配置信息用于 IT 资产管理
诊断工具:硬件故障诊断和系统兼容性检查
授权管理:基于硬件信息的软件授权系统
远程管理:在远程管理工具中收集客户端硬件信息
优势特点
易于使用:简单的 API 设计,快速上手
功能完整:支持 SMBIOS 规范的大部分数据结构
性能优秀:直接内存访问,响应迅速
文档完善:项目包含详细的使用示例和文档
活跃维护:定期更新,支持最新的 SMBIOS 规范
总结
tSMBIOS 项目为 Pascal 开发者提供了一个强大、可靠的 SMBIOS 访问解决方案。无论是开发系统工具、管理软件还是诊断程序,这个库都能大大简化硬件信息获取的复杂度。其跨平台特性和完整的 SMBIOS 支持使其成为 Pascal 生态系统中不可或缺的工具之一。
通过简单的几行代码,开发者就能获取到详细的系统硬件信息,无需深入了解复杂的 SMBIOS 规范底层细节。项目的开源特性也意味着开发者可以根据自己的需求进行定制和扩展。
如果你正在使用 Pascal 开发需要访问硬件信息的应用程序,tSMBIOS 绝对值得尝试。




还没有评论,来说两句吧...