Ceci est une ancienne révision du document !
Conversion depuis Delphi
Énoncé du problème
Dans mes recherches j'ai trouvé du code Delphi faisant (a peu prés) ce que je cherche a faire.
Et effectivement avec Delphi çà marche, mais avec Lazarus, cela ne fonctionne pas !
Le PROBLÈME est ce fichu fichier WbemScripting_TLB.pas
qui vient d'une importation d'un fichier TLB C:\WINDOWS\system32\wbem\wbemdisp.TLB
pour le fichier originale et C:\Windows\SysWOW64\wbem\wbemdisp.TLB
pour le fichier que j'ai moi même régénéré.
Ce fichier n'est pas compatible avec Lazarus.
J'ai donc décidé de créer ce fichier à partir de Lazarus et j'explique ci-dessous comment j'ai fait et les modifications a faire au code source pour que cela fonctionne.
Ci dessous nous allons trouver :
- La source originale en Delphi que j'ai trouvé.
Sources Delphi Originales
- Delphi
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, WbemScripting_TLB, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private FSink: TSWbemSink; FLocator: ISWbemLocator; FServices: ISWbemServices; procedure EventReceived(ASender: TObject; const objWbemObject: ISWbemObject; const objWbemAsyncContext: ISWbemNamedValueSet); public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} { 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 := TSWbemSink.Create(self); //assign the event handler FSink.OnObjectReady := EventReceived; //Run the ExecNotificationQueryAsync FServices.ExecNotificationQueryAsync(FSink.DefaultInterface,WQL,'WQL', 0, nil, nil); end; procedure TForm1.EventReceived(ASender: TObject; const objWbemObject: ISWbemObject; const 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; end.
Source de ce sode : https://theroadtodelphi.com/2011/04/18/delphi-and-wmi-events/
Importer un fichier TLB avec Lazarus
LazActiveX
Importer le TLB
Cela nous donne accés a un nouveau menu Importer la bibliothèque de types…
:
Une fois cliqué sur le menu on se retrouve dans cette fenêtre.
- On choisi [ActiveX References]
- On cherche [Microsoft WMI Scripting]
- On clique sur OK et cela nous génére un fichier
WbemScripting_1_2_TLB.pas