2010-09-09 2 views
0

Я нашел в Интернете, но у меня не получилось, как я могу использовать ManagementObjectSearcher в delphi. Мой главный вопрос, какой файл я должен добавить в 'uses'.Как использовать ManagementObjectSearcher в Delphi?

Я нашел one code, но не могу запустить его в своей системе.

+0

Я предполагаю, что вы пробовали пример с Delphi * Prism *? –

+0

@Lieven, я использую 'delphi 2007'. Извините, я забыл упомянуть об этом. – Himadri

+0

Итак, в Delphi 2007 таких вещей нет? – Himadri

ответ

5

Himadri, код которым вы ссылаетесь использует в Delphi PrismManagementObjectSearcher, то ManagementObjectSearcher класс .Net для получения информации о WMI. вы можете получить доступ к WMI из delphi, используя 3 альтернативы.

1) импортировав Microsoft WMIScripting Library из Component-> Import Component, а затем выберите Import type library.

program WMI_Test; 

{$APPTYPE CONSOLE} 

uses 
    ActiveX, 
    Variants, 
    SysUtils, 
    WbemScripting_TLB in '..\..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas';// 


Procedure AccessWMI; 
var 
    WMIServices : ISWbemServices; 
    Root  : ISWbemObjectSet; 
    Item  : Variant; 
begin 
    WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); 
    Root := WMIServices.ExecQuery('Select Caption FROM Win32_OperatingSystem','WQL', 0, nil); 
    Item := Root.ItemIndex(0); 
    Writeln(VarToStr(Item.Caption)); 
end; 


begin 
    try 
    CoInitialize(nil); 
    AccessWMI; 
    Readln; 
    CoUninitialize; 
    except 
    on E:Exception do 
    Begin 
     CoUninitialize; 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    End; 
    end; 
end. 

2) использовать COM позднего связывания

program WMI_Test; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils 
    ,ActiveX 
    ,ComObj 
    ,Variants; 


Procedure AccessWMI; 
var 
    objWMIService : OLEVariant; 
    colItems  : OLEVariant; 
    colItem  : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 

    function GetWMIObject(const objectName: String): IDispatch; 
    var 
    chEaten: Integer; 
    BindCtx: IBindCtx; 
    Moniker: IMoniker; 
    begin 
    OleCheck(CreateBindCtx(0, bindCtx)); 
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); 
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); 
    end; 

begin 
    objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2'); 
    colItems  := objWMIService.ExecQuery('SELECT Caption FROM Win32_OperatingSystem','WQL',0); 
    oEnum   := IUnknown(colItems._NewEnum) as IEnumVariant; 
    if oEnum.Next(1, colItem, iValue) = 0 then 
    Writeln(VarToStr(colItem.Caption)); 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     AccessWMI; 
     Readln; 
    finally 
    CoUninitialize; 
    end; 
except 
    on E:Exception do 
    Begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    End; 
    end; 
end. 

3) с использованием библиотеки WMI, как GLibWMI VCL Component Library

alt text

вы можете нашли несколько образцов в SO о WMI and Delphi

+0

http://stackoverflow.com/questions/2497253/how-to-get-motherboard-id-or-serial-number -delphi/2497314 # 2497314 Я уже видел этот ответ. Я хочу детали процессора. Использование Win32_Processor – Himadri

1

Другой вариант - это мы Е Delphi 2007 .Net личности (если у вас есть RadStudio 2007), который основан на платформе .NET Framework проверки 2,0

этот пример, чтобы получить доступ к ManagementObjectSearcher из приложения Delphi 2007 .Net консоли.

program WmiTest; 
{$APPTYPE CONSOLE} 
uses 
    System.Management, 
    SysUtils; 
var 
Searcher : ManagementObjectSearcher ; 
Collection : ManagementObjectCollection; 
iter  : ManagementObjectCollection.ManagementObjectEnumerator; 
WmiObject : ManagementObject; 
begin 
    try 
    Searcher :=ManagementObjectSearcher.Create('SELECT Caption FROM Win32_OperatingSystem'); 
    Collection:=Searcher.Get(); 
    iter:=Collection.GetEnumerator; 
    while(iter.MoveNext()) do 
    begin 
     WmiObject:=ManagementObject(iter.Current); 
     Writeln(WmiObject['Caption']); 
    end; 
    Readln; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end. 
Смежные вопросы