Wie kann ich die WMI-Leistung mit Delphi verbessern?
Ich habe eine einfache Funktion zum Abrufen von Systeminformationen mithilfe der WMI geschrieben, bei der die Klasse und der Eigenschaftsname als Parameter übergeben wurden. wenn ich die Funktion so ausführe
<code> Writeln('Procesor Id '+GetWMIInfo('Win32_Processor','Name')); Writeln('Mother Board Serial '+GetWMIInfo('Win32_BaseBoard','SerialNumber')); Writeln('BIOS Version '+GetWMIInfo('Win32_BIOS','Version')); </code>
Die Ausführungszeit beträgt ca. 1300 ms.
Ich muss viele zusätzliche Informationen abrufen. Ist es also möglich, die Ausführungszeit dieser Funktion zu verkürzen?
Dies ist eine Beispielanwendung mit der Funktion
<code>{$APPTYPE CONSOLE} uses Diagnostics, SysUtils, ActiveX, ComObj, Variants; function GetWMIInfo(const WMIClass, WMIProperty:string): string; var sWbemLocator : OLEVariant; sWMIService : OLEVariant; sWbemObjectSet: OLEVariant; sWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; Result:=''; sWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); sWMIService := sWbemLocator.ConnectServer('', 'root\CIMV2', '', ''); sWbemObjectSet:= sWMIService.ExecQuery('SELECT * FROM '+WMIClass,'WQL'); oEnum := IUnknown(sWbemObjectSet._NewEnum) as IEnumVariant; if oEnum.Next(1, sWbemObject, iValue) = 0 then Result:=sWbemObject.Properties_.Item(WMIProperty).Value; end; var SW : TStopwatch; begin try CoInitialize(nil); try SW.Reset; SW.Start; Writeln('Procesor Id '+GetWMIInfo('Win32_Processor','Name')); Writeln('Mother Board Serial '+GetWMIInfo('Win32_BaseBoard','SerialNumber')); Writeln('BIOS Version '+GetWMIInfo('Win32_BIOS','Version')); SW.Stop; Writeln('Elapsed ms '+FormatFloat('#,0.000',SW.Elapsed.TotalMilliseconds)); finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname, ':', E.Message); end; Readln; end. </code>