CWMIBase.pas
上传用户:lyghuaxia
上传日期:2022-06-27
资源大小:659k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit CWMIBase;
  2. //=========================================================================
  3. //
  4. // I N T E R F A C E
  5. //
  6. //=========================================================================
  7. interface
  8. uses
  9.   Windows, Messages, SysUtils, Classes, WbemScripting_TLB, FormAbout;
  10. type
  11.   TArrVariant = array of variant;
  12.   TArrString = array of string;
  13.   TArrInteger = array of Integer;
  14.   TParamType = (ptIn, ptOut);
  15.   TWMIGenericPropType = (gptString, gptStringArray, gptInteger, gptInteger64,
  16.                          gptIntegerArray, gptReal, gptBoolean, gptDateTime,
  17.                          gptChar, gptReference, gptObject);
  18.   TWMIBase = class(TComponent)
  19.   private
  20.     aServices:ISWbemServices;
  21.     FActive: Boolean;
  22.     FAllProperties: TStrings;
  23.     FObjectsCount: integer;
  24.     FConnected: Boolean;
  25.     FHost: string;
  26.     FObjectIndex: integer;
  27.     FAboutGLibWMI: TFAbout;
  28.     FMSDNHelp: String;
  29.     FComponentCaption: string;
  30.     function GetAllProperties: TStrings;
  31.     procedure SetObjectIndex(const Value: integer);
  32.     function GetComponentCaption: string;
  33.   protected
  34.     procedure SetActive(const Value: Boolean); virtual;
  35.     //: Clase para el componente
  36.     function GetWMIClass():string; virtual; abstract;
  37.     //: Obtener el root.
  38.     function GetWMIRoot():string; virtual; abstract;
  39.     //: Conectar al proveedor.
  40.     procedure ConnectWMI();
  41.     //: Lipiar las propiedades
  42.     procedure ClearProps(); virtual;
  43.     //: Rellenar las propiedades.
  44.     procedure FillProperties(AIndex:integer); virtual;
  45.   public
  46.     // redefinidos
  47.     constructor Create(AOwner: TComponent); override;
  48.     //: destructor
  49.     destructor Destroy; override;
  50.     //: Conectado correctamente
  51.     property Connected:Boolean read FConnected;
  52.     //:
  53.     property WMIServices:ISWbemServices read aServices;
  54.     //: Propiedad con la clase del componente
  55.     property WMIClass:string read GetWMIClass;
  56.   published
  57.     //: Caption del componente
  58.     property ComponentCaption:string read GetComponentCaption write FComponentCaption stored False;
  59.     //: Informaci髇 acerca del paquete de componentes
  60.     property VersionGLib:TFAbout read FAboutGLibWMI stored false;
  61.     //: Acceso a la p醙ina de documentaci髇 de MSDN
  62.     property MSDNHelp:String read FMSDNHelp write FMSDNHelp stored false;
  63.     //: Host al que nos queremos conectar
  64.     property Host:string read FHost write FHost;
  65.     //: Activar el componente.
  66.     property Active:Boolean read FActive write SetActive;
  67.     //: odas las propiedades como texto
  68.     property AllProperties:TStrings read GetAllProperties write FAllProperties;
  69.     //: Objetos encontrados para esa clase.
  70.     property ObjectsCount:integer read FObjectsCount write FObjectsCount stored False;
  71.     //: Objeto que estamos visualizando en las propiedades.
  72.     property ObjectIndex:integer read FObjectIndex write SetObjectIndex stored False;
  73.   end;
  74. //=========================================================================
  75. //
  76. // I M P L E M E N T A T I O N
  77. //
  78. //=========================================================================
  79. implementation
  80. { TWMIBase }
  81. uses
  82.   UProcedures, UConstantes, Dialogs, Variants;
  83. destructor TWMIBase.Destroy();
  84. begin
  85.   // Asignado?
  86.   if Assigned(Self.FAllProperties) then begin
  87.     // Crear la lista
  88.     FreeAndNil(Self.FAllProperties);
  89.   end;
  90.   // heredado
  91.   inherited;
  92. end;
  93. constructor TWMIBase.Create(AOwner: TComponent);
  94. begin
  95.   inherited;
  96.   // Ini
  97.   Self.FObjectsCount := 0;
  98.   Self.FObjectIndex := 0;
  99.   Self.FConnected := False;
  100.   Self.FActive := False;
  101.   Self.FAllProperties := TStringList.Create();
  102.   // ini Conexion
  103.   Self.FHost := '.';
  104. end;
  105. procedure TWMIBase.SetActive(const Value: Boolean);
  106. var
  107.   b:Boolean;
  108.   TS:TStrings;
  109. begin
  110.   // Guardar el valor
  111.   Self.FActive := Value;
  112.   // Desactivado? limpiar
  113.   if not (Value) then begin
  114.     Self.FObjectsCount := 0;
  115.     Self.FObjectIndex := 0;
  116.     Self.FAllProperties.Text := STR_EMPTY;
  117.     ClearProps;     
  118.     Exit;
  119.   end;
  120.   // ini
  121.   Self.FAllProperties.Clear;  
  122.   // Conectar
  123.   Self.ConnectWMI;
  124.   if not (Self.Connected) then begin
  125.     raise Exception.Create('No se ha conectado.');
  126.     Exit;
  127.   end;
  128.   // Activando?
  129.   if (Value) then begin
  130.     // Conectado?
  131.     if (Self.Connected) then begin
  132.       // Obtener las propiedades
  133.       GetWMIProperties(0, aServices, GetWMIClass(), Self.FAllProperties);
  134.   // Debug      FAllProperties.SaveToFile('r:all.txt');
  135.       // Obtener el n鷐ero de objetos
  136.       Self.ObjectsCount := Self.FAllProperties.Count;
  137.       // Hay algun objeto?
  138.       if (Self.ObjectsCount <= 0) then begin
  139.         Exit;
  140.       end
  141.       else begin
  142.         // Cargar el primero
  143.         Self.FObjectIndex := 1;
  144.         Self.FillProperties(Self.FObjectIndex);
  145. //-- MessageDlg('Fill', mtInformation, [mbOK], 0);
  146.       end;
  147. //--MessageDlg('objetos: ' + IntToStr(Self.ObjectsCount), mtInformation, [mbOK], 0);
  148.     end;
  149.   end;
  150.   Exit;
  151.   
  152.   // Obtener todas las propiedades
  153.   if (Self.ObjectsCount > 0) then begin
  154.     TS := TStringList.Create();
  155.     // proteccion
  156.     try
  157.       // Obtener las propiedades
  158.       GetWMIProperties(0, aServices, GetWMIClass(), TS);
  159.       Self.FAllProperties.Text := TS.Text;
  160.     finally
  161.       FreeAndNil(TS);
  162.     end;
  163.   end;
  164. //--MessageDlg(Format('%d  Objetos encontrados', [FObjectsCount]), mtInformation, [mbOK], 0);
  165. end;
  166. function TWMIBase.GetAllProperties(): TStrings;
  167. begin
  168. //  if not Assigned(Self.FAllProperties) then begin
  169. //    MessageDlg('Self.FAllProperties  NULL', mtInformation, [mbOK], 0);
  170. //    Exit;
  171. //  end;
  172.   // Result
  173.   Result := Self.FAllProperties;
  174. end;
  175. //: Conectar al proveedor.
  176. procedure TWMIBase.ConnectWMI();
  177. var
  178.   Locator:  ISWbemLocator;
  179. begin
  180.   try
  181.     // Create the Location object
  182.     Locator := CoSWbemLocator.Create();
  183.     // Connect to the WMI service, with the rootcimv2 namespace
  184.     aServices := Locator.ConnectServer(
  185.         Self.FHost,      // Host
  186.         GetWMIRoot(),    // root
  187.         {user}STR_EMPTY, {password}STR_EMPTY,
  188.         STR_EMPTY, STR_EMPTY, 0, nil);
  189.     Self.FConnected := True;
  190. //-MessageDlg('Conectado', mtInformation, [mbOK], 0);
  191.   except
  192.     Self.FConnected := False;
  193. //-MessageDlg('No Conectado', mtInformation, [mbOK], 0);
  194.     //+G  EXCEPCION PRPIA
  195.     raise Exception.Create(GetLastErrorAsString());
  196.   end;
  197. end;
  198. procedure TWMIBase.SetObjectIndex(const Value: integer);
  199. begin
  200.   if (csLoading in ComponentState) then begin
  201.     Exit;
  202.   end;
  203.   // Si no ha cambiado, nada
  204.   if (Self.FObjectIndex = Value) then begin
  205.     Exit;
  206.   end;
  207.   // Modificar el 韓dice
  208.   Self.FObjectIndex := Value;
  209.   // no Conectado?
  210.   if not (Self.Connected) then begin
  211.     Self.FObjectIndex := 0;
  212.     raise Exception.Create('Componente no conectado...  (crear tipo espec韋ico)');
  213.     Exit;
  214.   end;
  215.   // Activando?
  216.   if not (Self.FActive) then begin
  217.     Self.FObjectIndex := 0;
  218.     raise Exception.Create('Componente no activado...  (crear tipo espec韋ico)');
  219.     Exit;
  220.   end;
  221.   // 韓dice incorecto?
  222.   if (Value < 1) or (Value > Self.FObjectsCount) then begin
  223.     Self.FObjectIndex := 0;
  224.     raise Exception.Create('蚽dice fuera de l韒ites...  (crear tipo espec韋ico)');
  225.     Exit;
  226.   end;
  227.   // Hay algun objeto?
  228.   if (Self.ObjectsCount <= 0) then begin
  229.     Self.FObjectIndex := 0;
  230.     Exit;
  231.   end;
  232.   //.
  233.   //.
  234.   //.
  235.   // si todo correcto rellenamos las propiedades
  236.   // Rellenar las propiedades del objeto especificado
  237.   Self.FillProperties(Self.FObjectIndex);
  238. end;
  239. //: Rellenar las propiedades.
  240. procedure TWMIBase.FillProperties(AIndex: integer);
  241. begin
  242.   // limipar las actuales
  243.   ClearProps();
  244.   // El resto se rellenan en las hijas
  245.   //...
  246. end;
  247. procedure TWMIBase.ClearProps;
  248. begin
  249.   // Limpiar la propiedad
  250.   Self.FAllProperties.Clear;
  251. end;
  252. // Caption del componente
  253. function TWMIBase.GetComponentCaption: string;
  254. var
  255.   v:Variant;
  256.   vNull:boolean;  
  257. begin
  258.   try
  259.     GetWMIPropertyValue(Self, 'Caption', v, vNull);
  260.     Self.FComponentCaption := VariantStrValue(v, vNull);
  261.   except
  262.     Self.FComponentCaption := STR_EMPTY;
  263.   end;
  264.   Result := FComponentCaption;
  265. end;
  266. end.