2014-06-05 2 views
1

프린터에 문제가있는 경우 Windows의 장치 관리자는 해당 프린터 옆에 특수 아이콘을 표시합니다.장치 (프린터, 스캐너, 마우스 등 ...)가 작동하지 않는지 감지합니다.

저는 Delphi XE2를 사용하고 있으며, Windows XP 이상에서 프로그래밍 방식으로 정보를 검색하는 방법을 알고 싶습니다.

function DetectDriversProblems() : TStringList; 
begin 
    // Scan Computer or query Windows to know if a driver has issues and 
    // return list of faulty hardware (if any) 
end; 

답변

4

당신은 Win32_PnPEntity WMI 클래스와 ConfigManagerErrorCode 속성을 사용할 수 있습니다.

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    ActiveX, 
    ComObj, 
    Variants; 

    Procedure ListDevicesConfigError; 
    const 
     wbemFlagForwardOnly = $00000020; 
    var 
     FSWbemLocator : OLEVariant; 
     FWMIService : OLEVariant; 
     FWbemObjectSet: OLEVariant; 
     FWbemObject : OLEVariant; 
     oEnum   : IEnumvariant; 
     iValue  : LongWord; 
    begin; 
     FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
     FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); 
     FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode <> 0','WQL',wbemFlagForwardOnly); 
     oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
     while oEnum.Next(1, FWbemObject, iValue) = 0 do 
     begin 
     Writeln(Format('Class GUID %s',[String(FWbemObject.ClassGUID)])); 
     Writeln(Format('Description %s',[String(FWbemObject.Description)])); 
     Writeln(Format('Device ID %s',[String(FWbemObject.DeviceID)])); 
     Writeln(Format('Manufacturer %s',[String(FWbemObject.Manufacturer)])); 
     Writeln(Format('Name %s',[String(FWbemObject.Name)])); 
     Writeln(Format('PNP Device ID %s',[String(FWbemObject.PNPDeviceID)])); 
     Writeln(''); 
     FWbemObject:=Unassigned; 
     end; 
    end; 

begin 
try 
    CoInitialize(nil); 
    try 
     ListDevicesConfigError; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln;  
end. 
+0

Brilliant, thanks man !!! – TheDude