FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 922, dernière mise à jour : 6 février 2020  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

Commentez


SommaireSystèmeWMILa gestion des erreurs WMI (3)
précédent sommaire suivant
 

On utilise un objet TSWbemLastError qui nous informe sur les causes de l'erreur SI une erreur WMI est disponible.
Dans le cas contraire la méthode Connect permettant de se connecter à l'objet COM, déclenchera une exception.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Les types d'erreurs rencontrées. (Nommage propre à l'application) 
Type TOriginError = (TypeErrorUnknow,WMIError,Win32Error,ProviderError,MethodError); 
... 
Function ExistWMIErreur(Var WMILastError: TSWbemLastError;AOwner: TComponent):Boolean; 
//Gestion d'erreur WMI, crée un objet SWbemLastError pour la dernière erreur générée. 
begin 
 Try 
   WMILastError:=Nil; 
   WMILastError:=TSWbemLastError.Create(AOwner); 
   WMILastError.ConnectKind := ckNewInstance; 
     // Si aucune erreur n'existe, la méthode connect déclenche une exception EOleSysError 
   WMILastError.Connect; 
   Result:=True; 
  
 Except 
 on E:EOleSysError do 
  begin 
   {cf. Vous pouvez consulter le fichier WinError.h du SDK Win32 :  Codes 0x4000-0x40ff are reserved for OLE 
     MessageId: E_FAIL = 0x80004005L 
     MessageText:  Unspecified error 
   } 
   Result:=False; 
   FreeAndNil(WMILastError); 
  end 
 end; 
end;

Mis à jour le 15 janvier 2014 Laurent Dardenne Pedro

Dans certains cas on souhaite déterminer si la dernière erreur est bien une erreur liée à WMI ou pas.
Les erreurs débutant par $ 8007xxxx sont des erreurs WIN32 et celles débutant par $ 8004xxxx des erreurs de WMI.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function OriginError(Code : HRESULT): TOriginError; 
//Détermine le type d'erreur 
begin 
 Result:=TypeErrorUnknow; 
 if (Code Xor HRESULT($80070000))<=$FFFF 
  then Result:=Win32Error 
  else 
   if (Code Xor HRESULT($80040000))<=$FFFF 
    then Result:=WMIError; 
  // Reste à implémenter ProviderError et MethodError   
end; 
  
Function StrOriginError(Code : HRESULT): String; 
begin 
 Case OriginError(Code) of 
   Win32Error : Result:='Erreur Win32'; 
   WMIError   : Result:='Erreur WMI'; 
   TypeErrorUnknow:Result:='Type erreur inconnue'; 
   // Reste à implémenter ProviderError et MethodError   
 end; 
end;
L'appel se faisant dans un bloc d'exception :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var WMILastError: TSWbemLastError; 
begin 
... 
    except 
     on E:Exception do 
      begin 
       if (E is EOleException) or (E is EOleSysError) 
        then 
          begin 
           if ExistWMIErreur(WMILastError,Self) 
            then ShowWMIErreur('Opération xxx',WMILastError,(E as EOleException)); 
  
            //Rappel sur le contexte du dernier appel WMI 
           Memo1.Lines.Add(#13#10+'Test d''item inexistant.'); 
            //Affiche l'origine de l'erreur à partir du code d'erreur de l'exception 
           Memo1.Lines.Add(StrOriginError((E as EOleException).ErrorCode));  
            // Affiche le message de l'exception 
           Memo1.Lines.Add('Erreur ['+IntToHex((E as EOleException).ErrorCode,8)+'] '+E.Message); 
          end 
        else Raise; //On redéclenche les exceptions non gérées 
       end; 
     end; //Except 
end;

Mis à jour le 15 janvier 2014 Laurent Dardenne Pedro

L'objet TSWBemlastError contient les même propriétés que la classe WMI __ExtendedStatus.
Il nous faut donc les récupérer via la collection de propriétés Properties_.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Procedure ShowWMIErreur(Msg:String; WMILastError: TSWbemLastError;E:EOleException); 
//Affiche les informations d'une erreur WMI 
var S:String; 
begin 
  
 S:='Informations d''erreur WMI :'+#13#10+#13#10+ 
    Msg+#13#10+ 
    'Operation : '+WMILastError.Properties_.Item('Operation',0).Get_Value+#13#10+ 
    'Provider : '+WMILastError.Properties_.Item('ProviderName',0).Get_Value+#13#10+ 
    'Description : '+WMIVariantToStr(WMILastError.Properties_.Item('Description',0).Get_Value)+#13#10+ 
    'paramètre : '+WMIVariantToStr(WMILastError.Properties_.Item('ParameterInfo',0).Get_Value)+#13#10+ 
    'Code : '+WMIVariantToStr(WMILastError.Properties_.Item('StatusCode',0).Get_Value); 
  
 if E<>Nil 
  then S:=S+#13#10+#13#10+ 
          'Code Exception'+#13#10+ 
          'Origine : '+StrOriginError(E.ErrorCode)+#13#10+ 
          'Erreur: ['+IntToHex(E.ErrorCode,8)+'] '+E.Message; 
  
 ShowMessage(S); 
end;
Vous pouvez surcharger cette méthode afin de gérer directement une interface de type ISWbemLastError en lieu et place d'un objet de type TSWbemLastError.

Mis à jour le 15 janvier 2014 Laurent Dardenne Pedro

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.