私は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。ニース、もう一度あなたは私の下位の答えを削除させます。 :)あなたが言ったことに加えて、ポスターは、物事をより簡単にするDelphiラッパーの無料セットであるMagWMIを見たいかもしれません。内部的には、複数のクエリをはるかに簡単にする情報のキャッシングを行います。ラッパーは無料で、本当に大規模なデモアプリケーションが付属しています。 –
これは私が言っていたものとほとんど同じですが、個人的にはキャッシュされたサービスのバールを関数に渡すのがより良い一般的なパターンだと思うので、テストフレームワークでそれらの変数をDIとモックすることができます。 –
もちろん、接続と機能をカプセル化するオブジェクトを作成する方が良いです。このサンプルアプリケーションは単なる概念証明です。またポイント3は決して言及されず、非常に重要です。 – RRUZ