Pytanie do specjalistów usługi WMI z poziomu Delphi (Windows Management Instrumentation).
Program, który staram się ukończyć używa zapytań WMI do pobierania danych o kompie.
Używam raptem kilka klas z przestrzeni nazw "root\CIMV2" (na przykład Win32_OperatingSystem, Win32_PnPEntity, etc...).
Pytanie. Czy istnieje prosta metoda sprawdzenia czy dana klasa istnieje w danej przestrzeni klas?
Na przykład: Używam klasy Win32_OperatingSystem z "root\CIMV2". Istnieje możliwość, że akurat ta klasa nie jest dostępna na komputerze użytkownika. Jak to sprawdzić?
Używam takiego rozwiązania, że pobieram WSZYSTKIE dostępne klasy i potem sprawdzam, czy dana klasa znajduje się na liście. Wykonanie poniższego kodu zajmuje na
moim PC ponad 1s. Jest to zbyt długi czas...
Zatem, znacie może lepszy sposób?
Kod:
var
WMI_ClassesList : TStringList; // List with supported classes
// ...
// Get Available WMI Classes
WMI_GetAvailableWMI_Classes(WMI_ClassesList); // Get classes into list
procedure WMI_GetAvailableWMI_Classes(const AList: TStringList); // This procedure takes to much time!
var
objSWbemLocator : OleVariant;
objWMIService : OleVariant;
colItems : OleVariant;
colItem : OleVariant;
begin
AList.Clear;
try
objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
objWMIService := objSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
colItems := objWMIService.SubclassesOf();
AList.BeginUpdate;
for colItem in GetOleVariantEnum(colItems) do
begin
AList.Add(colItem.Path_.Class);
end;
AList.EndUpdate;
finally
objSWbemLocator:= Unassigned;
objWMIService := Unassigned;
colItem := Unassigned;
colItems := Unassigned;
end;
end;
// ...
// Check If Class (Win32_OperatingSystem) Exists in NameSpace (root\CIMV2)
if WMI_ClassesList .IndexOf('Win32_OperatingSystem') <> -1 then
begin
end
Chętnie wysłucham pomysłów...
-Pawel