2010-09-09 17 views
0

J'ai trouvé sur Internet mais je ne savais pas comment utiliser ManagementObjectSearcher dans Delphi. Ma question principale quel fichier je dois ajouter dans «utilise».Comment utiliser ManagementObjectSearcher dans Delphi?

J'ai trouvé one code mais je ne peux pas le faire fonctionner dans mon système.

+0

Je suppose que vous avez essayé l'exemple avec Delphi * Prism *? –

+0

@Lieven, j'utilise 'delphi 2007'. Désolé, j'ai oublié de mentionner à ce sujet. – Himadri

+0

Donc, une telle chose n'existe pas dans Delphi 2007? – Himadri

Répondre

5

Himadri, le wich code utilise la référence en ManagementObjectSearcherDelphi Prism, la ManagementObjectSearcher est une classe .Net pour récupérer des informations sur le WMI. vous pouvez accéder à WMI depuis Delphi en utilisant 3 alternatives.

1) en important le composant Microsoft WMIScripting Library depuis Component-> Import Component, puis en sélectionnant Importer la bibliothèque de types.

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) utiliser un COM liaison tardive

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) en utilisant une bibliothèque WMI, comme le GLibWMI VCL Component Library

alt text

vous pouvez trouver plusieurs échantillons dans SO sur le WMI and Delphi

+0

http://stackoverflow.com/questions/2497253/how-to-get-motherboard-id-or-serial-number -delphi/2497314 # 2497314 J'ai déjà vu cette réponse. Je veux les détails du processeur. Utilisation de Win32_Processor – Himadri

1

Une autre option est nous e la personnalité Delphi 2007 .Net (si vous avez le RadStudio 2007) qui est basé sur .NET Framework 2.0

vérifier cet échantillon pour accéder au ManagementObjectSearcher à partir d'une application console 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.