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

C++Builder Discussion :

IEnumVARIANT indéfini et identification hardware


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut IEnumVARIANT indéfini et identification hardware
    Bonjour,

    J'ai un petit problème pour utiliser le WMI de windows.
    J'essaie de récupérer l'aresse MAC des cartes réseaux d'après un code sur internet trouvé avec google et je bloque au début du code.
    Je fais les déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UnicodeString __fastcall TForm1::MACAdresse()
    {
    SWbemServices *WmiService;
    SWbemObject *WmiObjet;
    SWbemObjectSet *wmiObjetSet;
    IEnumVariant *ObjectEnumerator;
    OleVariant ArrayVariant;
    LongWord  NumberItem;
    TSWbemLocator *WMILocator;
    }
    Et le compilateur indique :
    [BCC32 Erreur] Unit1.cpp(219): E2451 Symbole 'IEnumVariant' non défini
    J'ai pourtant fait tous les includes. J'en ai même rajouter pou trouver celui qui manque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <OleServer.hpp>
    #include <Variants.hpp>
    #include <WbemScripting_OCX.h>
    #include <WbemScripting_TLB.h>
    #include <SysUtils.hpp>
    #include <ActiveX.hpp>
    #include <ComObj.hpp>
    #include <Oleauto.h>
    #include <SysUtils.hpp>
    Dans l'aide de c++Builder (ms-help://embarcadero.rs2009/Automat/html/139e3c93-faef-4003-9079-e0e94494db3e.htm) il est indiqué qu'il y a un fichier exemple Enumvar.cpp qui ne se trouve pas sur mon disque.

    Avec Delphi, il n'y a aucun problème, tout fonctionne.

    Une solution?

    J'essaie de créer un numéro unique pour identifier une machine qui doit envoyer des données régulièrement dans une base de données. Et il faut que ce numéro soit toujours le même après un formatage, donc, je pensais faire un numéro basé sur l'adresse MAC. Si vous avez une autre idée à la place, je suis preneur.

    Merci

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut gandf
    Il y a un Tuto sur le site a cette adresse
    Tu a aussi la Faq Delphi tres complete
    Et dans la Faq Delphi ceci, comment se connecter a WMI

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Merci.
    Mais j'ai déjà recherché dans tous ces articles et ceux référencés par ceux-ci.

    J'ai pu avancé. J'ai trouvé qu'il est déclaré dans le fichier ActiveX.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    { IEnumVARIANT interface }
    { Casing of this matches the MS platform SDK casing.  Needs to be this way, or C++
      will break. }
     
      {$EXTERNALSYM IEnumVARIANT}
      IEnumVARIANT = interface(IUnknown)
        ['{00020404-0000-0000-C000-000000000046}']
        function Next(celt: LongWord; var rgvar : OleVariant;
          out pceltFetched: LongWord): HResult; stdcall;
        function Skip(celt: LongWord): HResult; stdcall;
        function Reset: HResult; stdcall;
        function Clone(out Enum: IEnumVARIANT): HResult; stdcall;
      end;
    Mais je ne comprends pas ce que veut dire les commentaires. Du coup, cette déclaration n'est pas présente dans le fichier hpp d'inclusion.

    On fait comment pour l'utiliser ?

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Si on ecrit la declaration comme ceci " IEnumVARIANT *ObjectEnumerator; " il n'y a plus l'erreur
    par contre j'en ai une sur cette ligne " TSWbemLocator *WMILocator; "
    j'ai ecrit ceci tire de MSND qui a semble fonctionner
    Variant locator = Variant::CreateObject("WbemScripting.SWbemLocator");
    je te passe le lien sur WMI MSND, il y a des exemples et beaucoup de lecture

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut

    Tiens c est quasi bon , sauf que çà enumere tous les materiels possedant une adresse mac ( chez moi j ai la carte reseau de virtualbox qui est listée )
    Besoin d un bouton , une listbox
    Creation de deux stringlist
    Utilisation de WMI
    Insertion dans la listbox
    Utilisation de la "table" : Win32_NetworkAdapter
    Utilisation des valeurs 18 et 32 correspondant rescpectivement à :
    - MACAdress
    - ProductName


    .cpp
    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
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #include <mmsystem.h>
    #include <winsock2.h>
    #include <StrUtils.hpp>
    #include <comdef.h>
    #include <wbemidl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
    CoInitialize(NULL);
    if(CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
    { ShowMessage("Erreur d'initilization du Programme");
    Application->Terminate();                                 }
    CoUninitialize();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // ProductName  32   MACAdress   18
    AnsiString Matos = "Win32_NetworkAdapter"  ;
    AnsiString SystemCheckedWin32 =  Matos ;
    TStringList *MACAdress = new TStringList();
    TStringList *ProductName = new TStringList();
     
    GetWmiInfo(MACAdress , AnsiReplaceText(SystemCheckedWin32, " ", "Win32_"),18);
    GetWmiInfo(ProductName , AnsiReplaceText(SystemCheckedWin32, " ", "Win32_"),32);
     
    for( int i=0   ; i< MACAdress->Count; i++ )
           {if ( MACAdress->Strings[i].Length() !=0 )
                  { ListBox1->Items->Add(ProductName->Strings[i]);
                    ListBox1->Items->Add(MACAdress->Strings[i]);
                  }}}
    //---------------------------------------------------------------------------
    .h
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <CheckLst.hpp>
    #include <ComCtrls.hpp>
     
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
            TButton *Button1;
            TListBox *ListBox1;
            void __fastcall Button1Click(TObject *Sender);
     
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
     
     // Information Détaillées du Systeme par WMI [System Check]
     void GetWmiInfo(TStrings *lpList, WideString wsClass , long id )
    {
      IWbemLocator *pWbemLocator = NULL;
      if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
      {
        IWbemServices *pWbemServices = NULL;
        WideString wsNamespace = (L"root\\cimv2");
        if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
        {
          IEnumWbemClassObject *pEnumClassObject = NULL;
          WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
          if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
          {
            IWbemClassObject *pClassObject = NULL;
            ULONG uCount = 1, uReturned;
            if(pEnumClassObject->Reset() == S_OK)
            {
              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
              {
                SAFEARRAY *pvNames = NULL;
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
                {
                  long vbl, vbu , idx;
                  SafeArrayGetLBound(pvNames, 1, &vbl);
                  SafeArrayGetUBound(pvNames, 1, &vbu);
                 // for(long idx=vbl; idx<=vbu; idx++)
                 // if( idx=id)
                 // on utilisera id = 18  pour MACAdress
                  if( idx=id)
                  {
                    long aidx = idx;
                    wchar_t *wsName = 0;
                    VARIANT vValue;
                    VariantInit(&vValue);
                    SafeArrayGetElement(pvNames, &aidx, &wsName);
                    BSTR bs = SysAllocString(wsName);
                    HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
                    SysFreeString(bs);
                    if(hRes == S_OK)
                    {
                      AnsiString s;
                      Variant v = *(Variant*)&vValue;
                      if(v.IsArray())
                      {for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
                        { Variant a = v.GetElement(i);
                          if(!s.IsEmpty())
                            s+=", ";
                            s+=VarToStr(a);
                        }
                      }
                      else  { s = VarToStr(v);   }
                      //lpList->Add(AnsiString(wsName)+"="+s);
                      //Je remplace par la ligne du dessous pour enlever le nom de la variable
                      //if ( s.Length() !=0 )  {lpList->Add(s);  }
                      //Je change encore , besoin des emplacements vides
                      lpList->Add(s);
                                  }
                  VariantClear(&vValue);
                  SysFreeString(wsName);
                  }}if(pvNames)SafeArrayDestroy(pvNames);
              }}if(pClassObject)pClassObject->Release();
          }if(pEnumClassObject)pEnumClassObject->Release();
        }if(pWbemServices)pWbemServices->Release();
      }if(pWbemLocator)pWbemLocator->Release();
    }
     __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Merci

    Bondelle, tu as réussit à me débloqué, c'était ça mon problème.

    cedni : J'avais presque fini mais ta solution répond mieux à mon problème que le code delphi que j'ai indiqué.

    Merci

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Edit:
    AH bah c est bien , j ai passé une heure dessus
    WMI à creuser donc

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

Discussions similaires

  1. Hardware et Software VertexProcessing
    Par CladStrife dans le forum DirectX
    Réponses: 18
    Dernier message: 14/10/2003, 15h16
  2. probleme identification et mot de passe root
    Par freums dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2003, 17h09
  3. Port Parallèle EPP ou ECP, hardware vs software ?
    Par TONIAPEL dans le forum Assembleur
    Réponses: 3
    Dernier message: 21/08/2003, 01h39
  4. [servlet][identification][url]
    Par welty dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 20/08/2003, 09h10
  5. identification lettre (pb accent)
    Par scorbo dans le forum C
    Réponses: 5
    Dernier message: 14/12/2002, 02h59

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