IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Erreur lecture tableau WMI


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut Erreur lecture tableau WMI
    Bonjour a tous,
    je suis entrain de créer une application qui affiche quelques paramètres réseau (IP, gateway,...). Cela fonctionne très bien mais le problème est que si je n'ai pas de gateway il me renvoie EVariantInvalidArgError. J'ai fai un if et lui demande si il est égal à NULL avant mais le problème est qu'il est dans un tableau et si il n'existe pas et je lui demande de lire dans [0] il me renvoie erreur. Quelqu'un sait comment verifier si le tableau existe ou s'il y a quelque chose dedans? ou une autre solution merci d'avance

  2. #2
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    je pense que tu peux vérifier dans un 1er temps si le tableau est nil
    puis si la longueur du tableau est <> 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if Assigned(MonTableau) then
      if Length(MonTableau) <> 0 then
        //traitement...
    Akim Merabet

  3. #3
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    enfaite je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0] = NULL ...
    Me renvoie erreur car il ne trouve pas le tableau et si j'enleve le [0] tout est correct. Mais si la gateway existe, donc le tableau aussi, il me renvoie erreur car c'est un tableau et je ne lui est pas mit [x]... T'es verification n'ont rien changer aux erreurs merci quand même... Quelqu'un aurait une autre solution?

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tu mets tout ça dans un try except...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
    if WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0] = NULL
    except
      //gestion du message comme quoi il n'y a pas de passerelle defaut.
    end;

  5. #5
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    si jai bien compris

    ceci renvois la valeur de l'item en l'occurence "DefaultIPGateway"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value
    et si l'item existe alors on accède aux propriétés du "DefaultIPGateway"

    donc il suffit de faire ca?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    (...)
    var
     item0: Variant;
    (...)
    if WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value <> null then
    begin
      item0 := WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0];
    end;
    Akim Merabet

  6. #6
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    Il me fait toujours erreur quand je test dans le tableau vu qu'il n'existe pas ...

  7. #7
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (...)
    var
     item0: Variant;
    (...)
    if WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value <> nil then
    begin
      item0 := WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0];
    end;
    <> nil pardon
    Akim Merabet

  8. #8
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    Il me dit types incompatibles...

  9. #9
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Bizarre je pensais que c'était un type interface retourné
    c'est quoi ton code exactement?
    Akim Merabet

  10. #10
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Ok essai ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          if Obj.Properties_.Item('DefaultIPGateway', 0) <> nil then
          begin
            if not VarIsNull(Obj.Properties_.Item('DefaultIPGateway', 0).Get_Value) then
              Showmessage(Obj.Properties_.Item('DefaultIPGateway', 0).Get_Value[0]);
          end;
    en fait le code complet aprés avoir lu un article sur developpez.com a propos de WMI
    laurent-dardenne.developpez.com/articles/wmi-p1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    procedure TForm1.btn2Click(Sender: TObject);
    var
      WMILocator:          TSWbemLocator;
      WmiService:          SWbemServices;
     
      Obj:           SWbemObject;
      ObjSet:        SWbemObjectSet;
      Enumerator:    IEnumVariant;
     
      VarArray:        OleVariant;
      Count:          LongWord;
     
      begin
      WMILocator:= TSWbemLocator.Create(self);
      try
     
        wmiService:= WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                            '', wbemConnectFlagUseMaxWait, nil);
     
        ObjSet := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration',
    					wbemFlagReturnWhenComplete,
    					Nil);
     
     
       Enumerator:= (ObjSet._NewEnum) as IEnumVariant;
     
     
        while (Enumerator.Next(1, VarArray, Count) = S_OK) do
        begin
          Obj := IUnknown(VarArray) as SWBemObject;
          mmo1.Lines.Add(AdjustLineBreaks(Obj.GetObjectText_(0)));
          if Obj.Properties_.Item('DefaultIPGateway', 0) <> nil then
          begin
            if not VarIsNull(Obj.Properties_.Item('DefaultIPGateway', 0).Get_Value) then
              Showmessage(Obj.Properties_.Item('DefaultIPGateway', 0).Get_Value[0]);
          end;
        end;
     
      finally
        WMILocator.Free;
      end;
     
     
    end;

    Merci ca ma permis de découvrir WMi
    Akim Merabet

  11. #11
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    tu peux supprimer cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     mmo1.Lines.Add(AdjustLineBreaks(Obj.GetObjectText_(0)));
    Akim Merabet

  12. #12
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    procedure TfmMain.buActualiserClick(Sender: TObject);
    var
      WmiLocator:          TSWbemLocator;
      WmiService:          SWbemServices;
      WmiObjectSet:        SWbemObjectSet;
      WmiObject:           SWbemObject;
      //WmiProperty:         SWbemProperty;
     
      Registre:            TRegistry;
     
      ObjectEnumerator:    IEnumVariant;
     
      ArrayVariant:        OleVariant;
      NumberItem:          LongWord;
     
      OldCursor:           TCursor;
      test:                String;
      item0: Variant;
    begin
      Registre := TRegistry.Create;
      WmiLocator:= TSWbemLocator.Create(self);
      try
     
        //////////////////////////////////////////////////////////
        // Recuperation des informations via WMI
        //////////////////////////////////////////////////////////
        // Connexion WMI (PCName, 'ROOT\CIMV2', UserName, UserPassword, '', '', ...)
        WmiService:= WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '',
                                              '', wbemConnectFlagUseMaxWait, nil);
     
        // Recuperation des infos Connexions réseaux
        WmiObjectSet := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration WHERE IPEnabled = True',
                                                wbemFlagReturnWhenComplete, nil);
     
        ObjectEnumerator:= (WmiObjectSet._NewEnum) as IEnumVariant;
        while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
        begin
          WmiObject := IUnknown(ArrayVariant) as SWBemObject;
            if WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0] <> NULL 
            Then edGateway.Text := WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0];
      Finally;
        WmiLocator.Free;
      end;
    end;

  13. #13
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    remplace ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0] <> NULL 
            Then 
    edGateway.Text := WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0];
    par ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          if WmiObject.Properties_.Item('DefaultIPGateway', 0) <> nil then
          begin
            if not VarIsNull(WmiObject.Properties_.Item('DefaultIPGateway', 0).Get_Value) then
              edGateway.Text := WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[0];
          end;
    et ca devrais être bon
    Akim Merabet

  14. #14
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    Merci pour votre aide, c'est parfait

  15. #15
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut
    Encore un tout petit problème comment vérifier que le [1] existe?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if WmiObject.Properties_.Item('DefaultIPGateway',0) <> nil Then
            begin
              if not VarIsNull(WmiObject.Properties_.Item('DefaultIPGateway', 0).Get_Value) Then
                edGateway.Text := WmiObject.Properties_.Item('DefaultIPGateway',0).Get_Value[1]
            End;
    le [0] existe il me le renvoie, si il existe pas il me le renvoie pas... Maintenant si je dois renvoyer le [1] comment verifier qu'il existe?

  16. #16
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    tu peux déjà vérifier que la propriété est bien du type array.

    si c'est un array tu récupère son count et tu peux parcourir l'array et tester chacune de ces valeurs.

    du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    (...)
     while (Enumerator.Next(1, VarArray, Count) = S_OK) do
        begin
          Obj := IUnknown(VarArray) as SWBemObject;
     
          pSet := obj.Properties_;
          pEnumerator := (pSet._NewEnum) as IEnumVariant;
     
          while pEnumerator.Next(1, pArr, pCount) = S_OK do
          begin
            p := IUnknown(parr) as SWbemProperty;
     
            if not VarIsNull(p.Get_Value) then
              if p.IsArray then
              begin
                for i := 0 to VarArrayDimCount(p) do
                   if not VarIsNull(p.Get_Value[i]) then
                     Showmessage(p.Get_Value[i]);
              end;
          end;
        end;
    (...)
    Akim Merabet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Lecture tableau Excel erreur NullReferenceException
    Par teo971 dans le forum VB.NET
    Réponses: 13
    Dernier message: 28/02/2014, 18h48
  2. [C#]Erreur lecture flux http et ecriture fichier
    Par f.colo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/01/2012, 10h40
  3. Erreur lecture fichier avi
    Par ooyeah dans le forum Windows XP
    Réponses: 4
    Dernier message: 11/04/2007, 22h19
  4. Erreur creation tableau
    Par jamy79 dans le forum iReport
    Réponses: 1
    Dernier message: 02/11/2006, 14h01
  5. [Collections] lecture tableau 2 dimensions
    Par heloise dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/09/2004, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo