本文作者:icy

Pascal GLibWMI:Windows 管理规范的强大封装库

icy 昨天 17 抢沙发
Pascal GLibWMI:Windows 管理规范的强大封装库摘要: Pascal GLibWMI:Windows 管理规范的强大封装库 项目概述 GLibWMI 是一个用于 Pascal(特别是 Delphi 和 Free Pascal)的开源库,...

Pascal GLibWMI:Windows 管理规范的强大封装库

Pascal GLibWMI:Windows 管理规范的强大封装库

项目概述

GLibWMI 是一个用于 Pascal(特别是 Delphi 和 Free Pascal)的开源库,它提供了对 Windows 管理规范(WMI)的简洁、高效的封装。该项目由 NeftaliDelphi 开发并维护,旨在简化 Pascal 开发者访问 Windows 系统管理信息的过程。

核心特性

1. 简洁的 API 设计

GLibWMI 提供了直观的类和方法,使得查询 WMI 信息变得简单直接,无需深入了解复杂的 WMI 底层结构。

2. 跨编译器兼容

支持 Delphi 和 Free Pascal/Lazarus,确保代码在不同 Pascal 开发环境中的可移植性。

3. 类型安全

通过强类型接口提供 WMI 数据访问,减少运行时错误。

4. 异步支持

提供异步查询功能,避免在获取大量系统信息时阻塞主线程。

5. 丰富的示例

项目包含多个实用示例,帮助开发者快速上手。

安装与配置

通过 Git 克隆项目:

text
git clone https://github.com/NeftaliDelphi/GLibWMI.git

手动安装:

  1. 下载项目 ZIP 文件

  2. GLibWMI 文件夹添加到 Pascal 项目的搜索路径中

  3. 在需要使用的单元中添加 GLibWMI 引用

使用示例

示例 1:获取系统基本信息

text
uses
  GLibWMI;

procedure GetSystemInfo;
var
  WMI: TGLibWMI;
  Results: TGLibWMIResults;
begin
  WMI := TGLibWMI.Create;
  try
    // 查询操作系统信息
    Results := WMI.Query('SELECT * FROM Win32_OperatingSystem');
    
    if Results.Count > 0 then
    begin
      WriteLn('操作系统: ', Results[0].GetString('Caption'));
      WriteLn('版本: ', Results[0].GetString('Version'));
      WriteLn('架构: ', Results[0].GetString('OSArchitecture'));
      WriteLn('安装日期: ', Results[0].GetDateTime('InstallDate'));
    end;
  finally
    Results.Free;
    WMI.Free;
  end;
end;

示例 2:获取 CPU 信息

text
procedure GetCPUInfo;
var
  WMI: TGLibWMI;
  Results: TGLibWMIResults;
  i: Integer;
begin
  WMI := TGLibWMI.Create;
  try
    Results := WMI.Query('SELECT * FROM Win32_Processor');
    
    for i := 0 to Results.Count - 1 do
    begin
      WriteLn('CPU ', i + 1, ':');
      WriteLn('  名称: ', Results[i].GetString('Name'));
      WriteLn('  制造商: ', Results[i].GetString('Manufacturer'));
      WriteLn('  核心数: ', Results[i].GetInteger('NumberOfCores'));
      WriteLn('  逻辑处理器: ', Results[i].GetInteger('NumberOfLogicalProcessors'));
      WriteLn('  当前时钟速度: ', Results[i].GetInteger('CurrentClockSpeed'), ' MHz');
    end;
  finally
    Results.Free;
    WMI.Free;
  end;
end;

示例 3:获取磁盘信息

text
procedure GetDiskInfo;
var
  WMI: TGLibWMI;
  Results: TGLibWMIResults;
  TotalSize, FreeSpace: Int64;
begin
  WMI := TGLibWMI.Create;
  try
    Results := WMI.Query('SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3');
    
    for var i := 0 to Results.Count - 1 do
    begin
      WriteLn('磁盘 ', Results[i].GetString('DeviceID'));
      WriteLn('  文件系统: ', Results[i].GetString('FileSystem'));
      
      TotalSize := Results[i].GetInt64('Size');
      FreeSpace := Results[i].GetInt64('FreeSpace');
      
      WriteLn('  总大小: ', FormatFloat('0.00', TotalSize / (1024*1024*1024)), ' GB');
      WriteLn('  可用空间: ', FormatFloat('0.00', FreeSpace / (1024*1024*1024)), ' GB');
      WriteLn('  使用率: ', FormatFloat('0.00', (1 - FreeSpace/TotalSize) * 100), '%');
    end;
  finally
    Results.Free;
    WMI.Free;
  end;
end;

示例 4:监控进程信息

text
procedure MonitorProcesses;
var
  WMI: TGLibWMI;
  Results: TGLibWMIResults;
begin
  WMI := TGLibWMI.Create;
  try
    // 获取前10个内存使用最多的进程
    Results := WMI.Query(
      'SELECT TOP 10 Name, ProcessId, WorkingSetSize ' +
      'FROM Win32_Process ' +
      'ORDER BY WorkingSetSize DESC'
    );
    
    WriteLn('内存使用最多的进程:');
    WriteLn('----------------------------------------');
    
    for var i := 0 to Results.Count - 1 do
    begin
      WriteLn(
        Format('%-30s PID: %-6d 内存: %.2f MB', [
          Results[i].GetString('Name'),
          Results[i].GetInteger('ProcessId'),
          Results[i].GetInt64('WorkingSetSize') / (1024*1024)
        ])
      );
    end;
  finally
    Results.Free;
    WMI.Free;
  end;
end;

示例 5:异步查询示例

text
uses
  GLibWMI, GLibWMI.Async;

procedure AsyncQueryExample;
var
  AsyncWMI: TGLibWMIAsync;
begin
  AsyncWMI := TGLibWMIAsync.Create;
  try
    // 设置查询完成事件
    AsyncWMI.OnQueryComplete := procedure(Results: TGLibWMIResults)
    begin
      try
        if Results.Count > 0 then
        begin
          WriteLn('计算机名称: ', Results[0].GetString('Name'));
          WriteLn('制造商: ', Results[0].GetString('Manufacturer'));
          WriteLn('型号: ', Results[0].GetString('Model'));
        end;
      finally
        Results.Free;
      end;
    end;
    
    // 执行异步查询
    AsyncWMI.QueryAsync('SELECT * FROM Win32_ComputerSystem');
    
    // 这里可以继续执行其他操作,查询会在后台进行
    
  finally
    AsyncWMI.Free;
  end;
end;

高级用法

自定义 WMI 查询

text
procedure CustomWMIQuery;
var
  WMI: TGLibWMI;
  Results: TGLibWMIResults;
begin
  WMI := TGLibWMI.Create;
  try
    // 使用自定义命名空间和查询
    WMI.Namespace := 'root\CIMV2';
    Results := WMI.Query(
      'SELECT Name, State, StartMode ' +
      'FROM Win32_Service ' +
      'WHERE State = "Running"'
    );
    
    WriteLn('运行中的服务:');
    for var i := 0 to Results.Count - 1 do
    begin
      WriteLn(
        Format('%-40s 启动模式: %s', [
          Results[i].GetString('Name'),
          Results[i].GetString('StartMode')
        ])
      );
    end;
  finally
    Results.Free;
    WMI.Free;
  end;
end;

实际应用场景

  1. 系统监控工具:开发系统资源监控应用程序

  2. IT 管理软件:创建远程系统管理工具

  3. 诊断工具:开发系统诊断和故障排除工具

  4. 资产管理系统:收集和管理计算机硬件和软件资产信息

  5. 性能分析工具:监控和分析系统性能指标

优势与特点

  1. 易于使用:相比直接使用 Windows API 或 COM 接口,GLibWMI 提供了更简洁的抽象层

  2. 性能优化:经过优化的查询执行和数据检索机制

  3. 错误处理:完善的异常处理和错误报告机制

  4. 活跃维护:项目持续更新,修复问题并添加新功能

  5. 文档齐全:提供详细的 API 文档和示例代码

注意事项

  1. 权限要求:某些 WMI 查询可能需要管理员权限

  2. 性能考虑:复杂的查询可能影响系统性能,建议在后台线程中执行

  3. 兼容性:不同 Windows 版本可能支持不同的 WMI 类和属性

结语

GLibWMI 为 Pascal 开发者提供了一个强大而优雅的解决方案,用于访问 Windows 系统的管理信息。无论是开发系统工具、监控应用程序还是管理软件,GLibWMI 都能显著简化开发过程,提高代码的可读性和可维护性。

通过上述示例,您可以看到 GLibWMI 如何将复杂的 WMI 查询简化为几行清晰的 Pascal 代码。如果您正在寻找一个可靠的 Pascal WMI 封装库,GLibWMI 绝对值得尝试。

访问 GitHub 项目页面 获取最新版本、完整文档和更多示例代码。

GLibWMI.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/2026/03/356.html发布于 昨天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,17人围观)参与讨论

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