Tôi đã viết một hàm đơn giản để truy xuất thông tin hệ thống bằng cách sử dụng WMI, truyền tham số lớp và tên thuộc tính. khi tôi thực hiện chức năng như thế nàyLàm cách nào để cải thiện hiệu năng WMI bằng delphi?
Writeln('Procesor Id '+GetWMIInfo('Win32_Processor','Name'));
Writeln('Mother Board Serial '+GetWMIInfo('Win32_BaseBoard','SerialNumber'));
Writeln('BIOS Version '+GetWMIInfo('Win32_BIOS','Version'));
Thời gian thực hiện là khoảng 1300 ms.
Tôi cần truy xuất nhiều thông tin bổ sung, Vì vậy, có thể giảm thời gian thực hiện chức năng này không?
Đây là một ứng dụng mẫu với chức năng
{$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. Đẹp, và một lần nữa bạn làm cho tôi xóa câu trả lời kém cỏi của tôi. :) Ngoài những gì bạn nói, các poster có thể muốn nhìn vào MagWMI, một bộ miễn phí của Delphi wrappers mà làm cho mọi thứ dễ dàng hơn. Nó trong nội bộ hiện một số bộ nhớ đệm của thông tin mà làm cho nhiều truy vấn dễ dàng hơn nhiều. Trình bao bọc là miễn phí và đi kèm với một ứng dụng demo thực sự mở rộng có thể giúp ích. –
vâng, điều này khá giống với những gì tôi nói ... tuy nhiên cá nhân tôi nghĩ rằng một mô hình chung tốt hơn là chuyển các vars dịch vụ đã lưu trữ vào hàm, điều này cho phép DI và chế nhạo những vars đó trong một khuôn khổ thử nghiệm . –
Tắt khóa học tốt hơn là tạo một đối tượng để đóng gói kết nối và chức năng. ứng dụng mẫu này chỉ là bằng chứng về khái niệm. Ngoài ra điểm 3 không bao giờ được đề cập và là rất quan trọng. – RRUZ