Ceci est une ancienne révision du document !
Manipulations avec WMI
Enumérer les properties d'un SWbemObject
- Version Courte
// On créé un enumérateur vEnum := IUnknown(ASWbemObject.Properties_._NewEnum) as IEnumVariant; while vEnum.Next(1, vSWbemProperty, vCardinal) = 0 do begin ... // ici on accéde a chaque properties avec vSWbemProperty end;
- Version complète
function SWbemObjectPropertiesToString(ASWbemObject: TSWbemObject): string; var vSWbemProperty: TSWbemProperty; //olevariant vPropValueV: olevariant; vPropvalueS: string; vCardinal: cardinal; vEnum: IEnumvariant; vVT: TVarType; begin Result := ''; vEnum := IUnknown(ASWbemObject.Properties_._NewEnum) as IEnumVariant; while vEnum.Next(1, vSWbemProperty, vCardinal) = 0 do begin vPropValueV := vSWbemProperty.Value; vVT := VarType(vPropValueV); if vVT > varQWord then vPropValueS := format('Variant de type (%d)', [vVT]) else vPropValueS := vartostrdef(vPropValueV, 'null'); Result += vSWbemProperty.Name + ' = ' + vPropValueS + chr(13) + chr(10); end; end;
Faire une Requête Asynchrone
Sources a étudier :
Phind dit...
Source : https://www.phind.com/
Pour utiliser SWbemSink
dans Free Pascal, vous devez d'abord créer une instance de l'objet SWbemSink
. Ensuite, vous pouvez utiliser cette instance en tant que paramètre ObjWbemSink
pour effectuer un appel asynchrone. Les événements de votre implémentation de SWbemSink
sont déclenchés lorsque l'état ou les résultats sont retournés, ou lorsque l'appel est terminé [0].
Pour créer une instance de l'objet SWbemSink
en Free Pascal, vous pouvez utiliser la méthode CreateComObject
de la bibliothèque ActiveX
fournie avec Free Pascal.
La méthode CreateComObject
crée une instance d'un objet COM spécifié par son identificateur de classe (CLSID) et renvoie une interface pour cet objet.
Le code suivant crée une instance de l'objet SWbemSink
en Free Pascal :
uses ActiveX; var SWbemSink: Variant; begin SWbemSink := CreateComObject('{75718C9A-F029-11d1-A1AC-00C04FB6C223}'); // Utilisez SWbemSink comme paramètre ObjWbemSink pour effectuer un appel asynchrone. end;
Ensuite, vous pouvez implémenter les événements de votre objet SWbemSink en utilisant des méthodes avec la signature appropriée. Par exemple, pour gérer l'événement OnObjectReady, vous pouvez créer une méthode avec la signature suivante :
procedure TMySWbemSink.OnObjectReady(const objWbemObject: IDispatch; const objWbemAsyncContext: IDispatch); begin // Code pour gérer l'événement OnObjectReady. end;
Enfin, vous pouvez associer votre instance SWbemSink à votre requête WMI en utilisant la propriété ObjectSink de votre objet SWbemServices. Le code suivant est un exemple de requête WMI qui utilise l'objet SWbemSink pour recevoir les résultats :
uses ActiveX, ComObj, Variants; var SWbemLocator: Variant; SWbemServices: Variant; SWbemSink: Variant; SWbemObjectSet: Variant; SWbemObject: Variant; WQL: string; begin // Initialisez COM. CoInitialize(nil); // Créez une instance de SWbemLocator et connectez-vous à l'ordinateur local. SWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); SWbemServices := SWbemLocator.ConnectServer('.', 'root\cimv2', '', ''); // Créez une instance de SWbemSink. SWbemSink := CreateComObject('{75718C9A-F029-11d1-A1AC-00C04FB6C223}'); // Associez SWbemSink à la requête WMI. SWbemServices.ObjectSink := SWbemSink; // Exécutez une requête WMI pour récupérer les noms des services. WQL := 'SELECT * FROM Win32_Service'; SWbemObjectSet := SWbemServices.ExecQuery(WQL, 'WQL', wbemFlagForwardOnly or wbemFlagReturnImmediately); // Parcourez les résultats. while not VarIsNull(SWbemObjectSet) and (not SWbemObjectSet.atEndOfStream) do begin SWbemObject := SWbemObjectSet.NextObject; // Code pour traiter SWbemObject. end; // Libérez les objets COM. SWbemObjectSet := Unassigned; SWbemObject := Unassigned; SWbemSink := Unassigned; SWbemServices := Unassigned; SWbemLocator := Unassigned; CoUninitialize; end;
En résumé, pour utiliser SWbemSink dans Free Pascal, vous devez créer une instance de l'objet SWbemSink en utilisant la méthode CreateComObject de la bibliothèque ActiveX. Ensuite, vous pouvez implémenter les événements de votre objet SWbemSink en utilisant des méthodes avec la signature appropriée. Enfin, vous pouvez associer votre instance SWbemSink à votre requête WMI en utilisant la propriété ObjectSink de votre objet SWbemServices.