whats new ¦  programming tips ¦  indy articles ¦  intraweb articles ¦  informations ¦  links ¦  interviews
 misc ¦  tutorials ¦  Add&Win Game

Tips (1541)

Database (90)
Files (137)
Forms (107)
Graphic (114)
IDE (21)
Indy (5)
Internet / LAN (130)
IntraWeb (0)
Math (76)
Misc (126)
Multimedia (45)
Objects/
ActiveX (51)

OpenTools API (3)
Printing (35)
Strings (83)
System (266)
VCL (242)

Top15

Tips sort by
component


Search Tip

Add new Tip

Add&Win Game

Advertising

46 Visitors Online


 
...Get Information about a Process using WMI?
Autor: experts-exchange
[ Print tip ]  

Tip Rating (49):  
     




uses
  
ActiveX, WbemScripting_TLB;

function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;
  var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecallexternal 'activeds.dll';

procedure DumpWMI_Process(Process: SWBemObject);
var
  
Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  SProp: ISWbemProperty;
  Prop: OleVariant;
  PropName: string;
  PropType: string;
  PropValue: string;
begin
  
Form1.Memo1.Lines.Add('+ WMI Path: ' + Process.Path_.Path);
  Enum := Process.Properties_._NewEnum as IEnumVariant;
  while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and
    
(lNumElements > 0) do
  begin
    if 
Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and
      
Assigned(SProp) then
    begin
      try
        
PropName  := SProp.Name;
        Prop := SProp.Get_Value;
        PropType := VarTypeAsText(VarType(Prop));
        PropValue := VarToStr(Prop);
        Form1.Memo1.Lines.Add('  + ' + PropName + '[' + PropType + '] = ' + PropValue);
      except
        on 
E: Exception do
        begin
          
// WriteLn(ErrOutput, PropName, ': ', E.Message);
        
end;
      end;
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  
Server: string;
  Enum: IEnumVARIANT;
  varArr: OleVariant;
  lNumElements: ULong;
  AName: array[0..255] of Char;
  ASize: DWORD;
begin
  if 
(ParamCount = 0) then
  begin
    
Server := '';
    ASize  := SizeOf(AName) - 1;
    if GetComputerName(@AName, ASize) then Server := AName;
  end
  else
  begin
    
Server := ParamStr(1);
  end;
  try
    
Memo1.Lines.BeginUpdate;
    Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
      '', '', '', 0, nil).ExecQuery('Select * from Win32_Process', 'WQL',
      wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
    while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and
      
(lNumElements > 0) do
    begin
      
DumpWMI_Process(IUnknown(varArr) as SWBemObject);
    end;
  finally
    
Memo1.Lines.EndUpdate;
  end;
end;

{
 You need the WbemScripting_TLB unit, which you can create by installing the type library
 <Windows System32>\wbem\wbemdisp.tlb type library using the "Project|Import type library" menu option.
}


 

Rate this tip:

poor
very good


Copyright © by SwissDelphiCenter.ch
All trademarks are the sole property of their respective owners