Ich schrieb eine einfache Funktion zum Abrufen von Systeminformationen mit dem WMI, übergibt als Parameter die Klasse und den Namen der Eigenschaft. Wenn ich die Funktion wie folgt ausfühleWie kann ich die WMI-Leistung mithilfe von Delphi verbessern?
Writeln('Procesor Id '+GetWMIInfo('Win32_Processor','Name'));
Writeln('Mother Board Serial '+GetWMIInfo('Win32_BaseBoard','SerialNumber'));
Writeln('BIOS Version '+GetWMIInfo('Win32_BIOS','Version'));
Die Ausführungszeit beträgt etwa 1300 ms.
Ich brauche viele zusätzliche Informationen abrufen, So ist möglich, die Zeit der Ausführung dieser Funktion zu reduzieren?
Dies ist eine Beispielanwendung, mit der Funktion
{$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.
+1. Nett, und wieder lässt du mich meine minderwertige Antwort löschen. :) Zusätzlich zu dem, was Sie gesagt haben, könnte das Poster MagWMI betrachten, eine kostenlose Sammlung von Delphi-Wrappern, die die Arbeit erleichtern. Es führt intern ein Caching von Informationen durch, die mehrere Abfragen viel einfacher machen. Der Wrapper ist kostenlos und kommt mit einer wirklich umfangreichen Demo-App, die helfen könnte. –
yep, das ist ziemlich genau die gleiche Sache, die ich sagte ... aber persönlich denke ich, ein besseres allgemeines Muster besteht darin, die zwischengespeicherten Service-Vars an die Funktion zu übergeben, dies ermöglicht DI und Spott dieser Vars in einem Test-Framework . –
Natürlich ist es besser, ein Objekt zu erstellen, um die Verbindung und die Funktion zu kapseln. Diese Beispiel-App ist nur ein Proof of Concept. Auch der Punkt 3 wird nie erwähnt und ist sehr wichtig. – RRUZ