我写了一个简单的函数来使用WMI检索系统信息,并将参数传递给类和属性名称。当我执行这样的功能时如何使用delphi提高WMI性能?
Writeln('Procesor Id '+GetWMIInfo('Win32_Processor','Name'));
Writeln('Mother Board Serial '+GetWMIInfo('Win32_BaseBoard','SerialNumber'));
Writeln('BIOS Version '+GetWMIInfo('Win32_BIOS','Version'));
执行时间大约是1300毫秒。
我需要检索很多附加信息,那么是否可以减少这个函数的执行时间?
这与功能
{$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。很好,而且你让我删除了我低级的答案。 :)除了你所说的,海报可能要看看MagWMI,这是一套免费的Delphi封装,让事情变得更简单。它在内部做一些信息的缓存,使得多个查询更容易。该包装是免费的,并附带一个非常广泛的演示应用程序,可能会有所帮助。 – 2012-04-17 22:03:22
是的,这与我所说的几乎是一回事......但是我个人认为更好的一般模式是将缓存服务变量传递给函数,这允许DI和模拟测试框架中的变量。 – 2012-04-17 22:17:34
当然更好的是创建一个对象来封装连接和函数。这个示例应用程序只是一个概念证明。此外,点3从未被提及并且非常重要。 – RRUZ 2012-04-17 22:22:24