Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
prog:lazarus:cas:wmi:convfromdelphi [03/04/2023 17:23]
thierry [Adaptation du code]
prog:lazarus:cas:wmi:convfromdelphi [03/04/2023 17:47] (Version actuelle)
thierry [Sources & Ressources]
Ligne 1: Ligne 1:
-====== Conversion ​depuis ​Delphi ======+====== Conversion ​WbemScripting_TLB de Delphi ​vers Lazarus ​======
 ===== Énoncé du problème ===== ===== Énoncé du problème =====
 Dans mes recherches j'ai trouvé du code **Delphi** faisant (a peu prés) ce que je cherche a faire. Dans mes recherches j'ai trouvé du code **Delphi** faisant (a peu prés) ce que je cherche a faire.
Ligne 12: Ligne 12:
 Ci dessous nous allons trouver :  Ci dessous nous allons trouver : 
   - La source originale en Delphi que j'ai trouvé.   - La source originale en Delphi que j'ai trouvé.
 +  - Comment importer un TLB avec Lazarus
 +  - La source corrigé en Free Pascal
  
 ===== Sources Delphi Originales ===== ===== Sources Delphi Originales =====
-<code delphi Delphi>+<code delphi Delphi ​[enable_line_numbers="​true"​]>
 unit Unit1; unit Unit1;
  
Ligne 80: Ligne 82:
  
 {{:​prog:​lazarus:​cas:​wmi:​activx1.jpg?​400|}} ​ {{:​prog:​lazarus:​cas:​wmi:​activx1.jpg?​400|}} ​
 +
 +Plus d'​infos ici : [[https://​wiki.lazarus.freepascal.org/​LazActiveX]]
 ==== Importer le TLB ==== ==== Importer le TLB ====
 Cela nous donne accés a un nouveau menu ''​Importer la bibliothèque de types...''​ : Cela nous donne accés a un nouveau menu ''​Importer la bibliothèque de types...''​ :
Ligne 93: Ligne 97:
 ===== Adaptation du code ===== ===== Adaptation du code =====
 ATTENTION il y a de grosses differences entre le code généré en **Delphi** et celui en **Lazarus**,​ hormis le nom du fichier... ATTENTION il y a de grosses differences entre le code généré en **Delphi** et celui en **Lazarus**,​ hormis le nom du fichier...
 +==== Exemple avec  TSWbemSink ====
 +
  
 Exemple ''​TSWbemSink''​ est devenu ​ ''​TEvsSWbemSink''​ et ses properties ont changé: ​ Exemple ''​TSWbemSink''​ est devenu ​ ''​TEvsSWbemSink''​ et ses properties ont changé: ​
-<code delphi Delphi>+<code delphi Delphi ​[enable_line_numbers="​true"​]>
   TSWbemSink = class(TOleServer)   TSWbemSink = class(TOleServer)
   private   private
Ligne 124: Ligne 130:
  
 </​code>​ </​code>​
-<code delphi Lazarus>+<code delphi Lazarus ​[enable_line_numbers="​true"​]>
   TEvsSWbemSink = Class(TEventSink)   TEvsSWbemSink = Class(TEventSink)
   Private   Private
Ligne 147: Ligne 153:
  
 </​code>​ </​code>​
 +==== Code Lazarus ====
 +<code delphi [enable_line_numbers="​true",​highlight_lines_extra="​14,​25,​29,​30,​53,​55,​57,​60,​61"​]>​
 +unit Unit1;
 +
 +{$mode objfpc}{$H+}
 +
 +interface
 +
 +uses
 +  ActiveX,
 +  StdCtrls,
 +  SysUtils,
 +  Forms,
 +  Controls,
 +  Dialogs,
 +  WbemScripting_1_2_TLB;​
 +
 +type
 +
 +  { TForm1 }
 +
 +  TForm1 = class(TForm)
 +    Button1: TButton;
 +    Memo1: ​  ​TMemo;​
 +    procedure Button1Click(Sender:​ TObject);
 +  private
 +    FSink: ​    ​TEvsSWbemSink;​
 +    FLocator: ​ ISWbemLocator;​
 +    FServices: ISWbemServices;​
 +
 +    procedure EventReceived(Sender:​ TObject; objWbemObject:​ ISWbemObject;​
 +      objWbemAsyncContext:​ ISWbemNamedValueSet);​
 +  public
 +
 +  end;
 +
 +var
 +  Form1: TForm1;
 +
 +implementation
 +
 +{$R *.lfm}
 +
 +{ TForm1 }
 +
 +procedure TForm1.Button1Click(Sender:​ TObject);
 +const
 +  WQL = '​SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "​Win32_Process"';​
 +begin
 +  FLocator ​ := CoSWbemLocator.Create;​
 +  //Connect to the WMI service
 +  FServices := FLocator.ConnectServer('​.',​ '​root\cimv2',​ '',​ '',​ '',​
 +    '',​ wbemConnectFlagUseMaxWait,​ nil);
 +  //create the sink instance
 +  FSink     := TEvsSWbemSink.Create(self);​
 +  //assign the event handler
 +  FSink.OnOnObjectReady := @EventReceived;​
 +  //Run the ExecNotificationQueryAsync
 +  FServices.ExecNotificationQueryAsync(FSink.ComServer,​ WQL, '​WQL',​ 0, nil, nil);
 +end;
 +
 +procedure TForm1.EventReceived(Sender:​ TObject; objWbemObject:​ ISWbemObject;​
 +  objWbemAsyncContext:​ ISWbemNamedValueSet);​
 +var
 +  PropVal: olevariant;
 +begin
 +  PropVal := objWbemObject;​
 +  Memo1.Lines.Add(Format('​Caption ​  : %s ', [PropVal.TargetInstance.Caption]));​
 +  Memo1.Lines.Add(Format('​ProcessID : %s ', [PropVal.TargetInstance.ProcessID]));​
 +end;
 +
 +initialization
 +  CoInitializeEx(nil,​ COINIT_MULTITHREADED);​ {Je ne sais pas si c'est utile, mais...}
 +
 +finalization;​
 +  CoUninitialize();​
 +
 +end.
 +</​code>​
 +===== Résultat =====
 +{{:​prog:​lazarus:​cas:​wmi:​extra1.jpg|}}
 +====== Sources & Ressources ======
 +  * [[https://​wiki.lazarus.freepascal.org/​LazActiveX]]
 +  * [[https://​theroadtodelphi.com/​2011/​04/​18/​delphi-and-wmi-events/​]]
 +
 +
 +