首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 透過 WMI 查詢 USB 裝置 PID/VID:SWbemLocator 連線與 Win32_USBHub 實戰範例

     編輯:Delphi

前言

Windows Management Instrumentation (WMI) 提供統一介面查詢系統軟硬體資訊。本文示範使用 Delphi 透過 SWbemLocator 連線 WMI,查詢 Win32_USBHub 類別取得 USB 裝置的 PID (Product ID) 與 VID (Vendor ID),並列出常用 WMI 查詢類別速查表。

核心程式碼實作

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj; // 必須引用 ActiveX, ComObj

procedure TForm1.Button2Click(Sender: TObject);
var
  Locator: OleVariant;
  WMI: OleVariant;
  Ret: OleVariant;
  Enum: IEnumVariant;
  Item: OleVariant;
  Value: Cardinal;
begin
  // 1. 建立 WMI 定位器
  Locator := CreateOleObject('WbemScripting.SWbemLocator');
  
  // 2. 連線本機 WMI 命名空間 (root\cimv2)
  WMI := Locator.ConnectServer('.', 'root\cimv2', '', '');
  
  // 3. 執行 WQL 查詢:所有 USB Hub 裝置
  Ret := WMI.ExecQuery('SELECT * FROM Win32_USBHub');
  
  // 4. 列舉結果集 (需介面轉型)
  Enum := IUnknown(Ret._NewEnum) as IEnumVariant;
  
  // 5. 逐項處理
  while Enum.Next(1, Item, Value) = S_OK do
  begin
    // 篩選大量儲存裝置 (隨身碟、外接硬碟)
    if VarToStr(Item.Name) = 'USB Mass Storage Device' then
    begin
      // PNPDeviceID 格式: "USB\VID_XXXX&PID_YYYY\SERIAL"
      ShowMessage('此 USB 裝置硬體 ID: ' + VarToStr(Item.PNPDeviceID));
      
      // 解析 VID/PID (可選)
      // VID_0781&PID_5567 → VID=0781, PID=5567
    end;
    Item := Unassigned; // 釋放 Variant 參考
  end;
end;

關鍵屬性解析 (Win32_USBHub)

屬性說明範例
DeviceIDWMI 內部裝置識別碼USB\VID_0781&PID_5567\1234567890
PNPDeviceID即插即用裝置 ID (含 VID/PID)USB\VID_0781&PID_5567\1234567890
Name裝置友善名稱USB Mass Storage Device
Description裝置描述大量儲存裝置
Status狀態OK, Error
Availability可用性3 (Running/Full Power)

解析 VID/PID 輔助函數

uses RegularExpressions;

procedure ParseVIDPID(const PNPDeviceID: string; out VID, PID: string);
var
  Match: TMatch;
begin
  VID := ''; PID := '';
  Match := TRegEx.Match(PNPDeviceID, 'VID_([0-9A-F]{4})&PID_([0-9A-F]{4})', [roIgnoreCase]);
  if Match.Success then
  begin
    VID := Match.Groups[1].Value;
    PID := Match.Groups[2].Value;
  end;
end;

// 使用
var VID, PID: string;
ParseVIDPID(VarToStr(Item.PNPDeviceID), VID, PID);
ShowMessage(Format('VID=%s, PID=%s', [VID, PID]));

常用 WMI 查詢類別速查表

類別用途關鍵屬性
Win32_ProcessorCPU 資訊Name, MaxClockSpeed, NumberOfCores, LoadPercentage
Win32_BaseBoard主機板Manufacturer, Product, SerialNumber
Win32_BIOSBIOSVersion, Manufacturer, ReleaseDate
Win32_PhysicalMemory實體記憶體模組Capacity, Speed, Manufacturer, PartNumber
Win32_LogicalDisk邏輯磁碟機DeviceID, Size, FreeSpace, FileSystem, VolumeName
Win32_DiskDrive實體磁碟機Model, Size, InterfaceType, SerialNumber
Win32_NetworkAdapter網路介面卡Name, MACAddress, Speed, NetConnectionStatus
Win32_NetworkAdapterConfiguration網路設定IPAddress, IPSubnet, DefaultIPGateway, DNSServerSearchOrder
Win32_VideoController顯示卡Name, AdapterRAM, DriverVersion, VideoModeDescription
Win32_OperatingSystem作業系統Caption, Version, BuildNumber, TotalVisibleMemorySize
Win32_Process執行中程序ProcessId, Name, ExecutablePath, CommandLine
Win32_ServiceWindows 服務Name, DisplayName, State, StartMode
Win32_Printer印表機Name, PortName, DriverName, WorkOffline
Win32_Battery電池 (筆電)EstimatedChargeRemaining, BatteryStatus, Chemistry
Win32_TemperatureProbe溫度感測器 (需硬體支援)CurrentReading

WQL 查詢進階技巧

// 條件過濾
WMI.ExecQuery('SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3'); // 固定磁碟
WMI.ExecQuery('SELECT * FROM Win32_Process WHERE Name = "notepad.exe"');
WMI.ExecQuery('SELECT * FROM Win32_Service WHERE State = "Running"');

// 關聯查詢 (ASSOCIATORS OF)
WMI.ExecQuery('ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"} WHERE ResultClass=Win32_DiskDrive');

// 事件通知 (非同步)
WMI.ExecNotificationQuery('SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "Win32_USBHub"');

錯誤處理與效能建議

  • CoInitialize:VCL 應用程式通常在 Application.Initialize 時已呼叫,若在執行緒中使用需自行 CoInitialize(nil)/CoUninitialize
  • Variant 清理:迴圈中 Item := Unassigned 釋放 COM 參考計數,避免洩漏
  • 查詢效能:WMI 查詢較慢 (百毫秒級),UI 執行緒建議用 TTask.Run 背景執行
  • 權限:部分類別需管理員權限 (如 Win32_Service 修改操作)

結語

WMI 是 Windows 系統資訊的「通用資料庫」。掌握 SWbemLocator → ConnectServer → ExecQuery → IEnumVariant 這套標準流程,即可輕鬆查詢 USB PID/VID、CPU 溫度、磁碟健康度、網路設定等數百種資訊。善用 WQL WHERE 子句過濾,能大幅提升查詢效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved