Escribí una función simple para recuperar información del sistema usando WMI, pasando como parámetro la clase y el nombre de la propiedad. cuando ejecuto la función de esta manera¿Cómo puedo mejorar el rendimiento de WMI usando Delphi?
Writeln('Procesor Id '+GetWMIInfo('Win32_Processor','Name'));
Writeln('Mother Board Serial '+GetWMIInfo('Win32_BaseBoard','SerialNumber'));
Writeln('BIOS Version '+GetWMIInfo('Win32_BIOS','Version'));
El tiempo de ejecución es de aproximadamente 1300 ms.
Necesito recuperar mucha información adicional, ¿Es posible reducir el tiempo de ejecución de esta función?
Esta es una aplicación de ejemplo con la función
{$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. Bien, y otra vez me haces eliminar mi respuesta inferior. :) Además de lo que dices, el póster podría querer ver MagWMI, un conjunto gratuito de envolturas Delphi que facilitan las cosas. Internamente hace un poco de almacenamiento en caché de la información que hace que las consultas múltiples sean mucho más fáciles. El contenedor es gratuito y viene con una aplicación de demostración realmente extensa que podría ser útil. –
sí, esto es más o menos lo mismo que decía ... sin embargo, personalmente creo que un mejor patrón general es pasar los vars de servicio en caché a la función, esto permite que DI y burlarse de esos vars en un marco de prueba . –
Por supuesto, mejor es crear un objeto para encapsular la conexión y la función. esta aplicación de muestra es solo una prueba de concepto. Además, el punto 3 nunca se menciona y es muy importante. – RRUZ