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

  1. #1
    Membre confirmé
    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
    Points : 523
    Points
    523
    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
    Points : 3 766
    Points
    3 766
    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 confirmé
    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
    Points : 523
    Points
    523
    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
    Points : 3 766
    Points
    3 766
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    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 confirmé
    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
    Points : 523
    Points
    523
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  8. #8
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Je suis content que tu ai reussi, je serais interressais par ton code car je n'arrive pas a solutionner ceci
    WmiService:= WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '', '', 0, nil);
    J'ai toujours une erreur, mais comme je n'ai pas de micros installes en reseau c'est peut etre de la que vient le probleme, de plus si j'arrive a comprendre comment WMI il sera peut etre possible de traduire une partie de la FAQ Delphi traitant ce sujet

  9. #9
    Membre confirmé
    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
    Points : 523
    Points
    523
    Par défaut
    En fait, j'ai écris un peu vite. Ca ne marche pas.
    J'ai fait quelques modifications mais le résultat de cette fonction est une liste de 0 du genre :
    0

    0

    0

    0

    0

    0

    0...
    En faisant d'autres recherches sur google, je suis tombé sur un code sur le site de embarcadero qui fonctionne bien. Je ne sais plus s'il faut faire des includes. Voici ce que j'ai :
    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
    UnicodeString __fastcall TForm1::MACAdresse()
    {
    UnicodeString result = "";
    // Get adapter list
    LANA_ENUM AdapterList;
    NCB Ncb;
    memset(&Ncb, 0, sizeof(NCB));
    Ncb.ncb_command = NCBENUM;
    Ncb.ncb_buffer = (unsigned char *)&AdapterList;
    Ncb.ncb_length = sizeof(AdapterList);
    Netbios(&Ncb);
    // Get all of the local ethernet addresses
    UnicodeString mac_addr;
    for (int i = 0; i <= AdapterList.length - 1; ++i)
        {
        if (GetAdapterInfo(AdapterList.lana[i], mac_addr))
           {
           result = result + L"-" + mac_addr;
           }
        else {
             break;
             }
        }
    return result;
    }
    //---------------------------------------------------------------------------
    bool __fastcall TForm1::GetAdapterInfo(int adapter_num, UnicodeString &mac_addr)
    {
    using namespace std;
    // Reset the LAN adapter so that we can begin querying it
    NCB Ncb;
    memset(&Ncb, 0, sizeof(Ncb));
    Ncb.ncb_command = NCBRESET;
    Ncb.ncb_lana_num = adapter_num;
    if (Netbios(&Ncb) != NRC_GOODRET)
       {
       mac_addr = "bad (NCBRESET): ";
       mac_addr += UnicodeString(Ncb.ncb_retcode);
       return false;
       }
    // Prepare to get the adapter status block
    memset(&Ncb,0,sizeof(Ncb));
    Ncb.ncb_command = NCBASTAT;
    Ncb.ncb_lana_num = adapter_num;
    strcpy((char *) Ncb.ncb_callname, "*");
    struct ASTAT
           {
           ADAPTER_STATUS adapt;
           NAME_BUFFER NameBuff[30];
           } Adapter;
    memset(&Adapter,0,sizeof(Adapter));
    Ncb.ncb_buffer = (unsigned char *)&Adapter;
    Ncb.ncb_length = sizeof(Adapter);
    // Get the adapter's info and, if this works, return it in standard,
    // colon-delimited form.
    if (Netbios(&Ncb) == 0)
       {
       char acMAC[18];
       sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
               int (Adapter.adapt.adapter_address[0]),
               int (Adapter.adapt.adapter_address[1]),
               int (Adapter.adapt.adapter_address[2]),
               int (Adapter.adapt.adapter_address[3]),
               int (Adapter.adapt.adapter_address[4]),
               int (Adapter.adapt.adapter_address[5]));
       mac_addr = acMAC;
       return true;
       }
    else {
         mac_addr = "bad (NCBASTAT): ";
         mac_addr += UnicodeString(Ncb.ncb_retcode);
         return false;
         }
    }
    Pour le faire par WMI, j'avais le début du code suivant qui fonctionnait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SWbemServices *WmiService;
    TSWbemLocator *WMILocator;
     
    WMILocator = new TSWbemLocator(this);
    try {
        try {
            WMILocator->Security_->set_AuthenticationLevel(WbemImpersonationLevelEnum::wbemImpersonationLevelImpersonate);
            WMILocator->Security_->set_AuthenticationLevel(WbemAuthenticationLevelEnum::wbemAuthenticationLevelDefault);
            WmiService = WMILocator->ConnectServer(L"root\\cimv2", NULL, NULL, NULL, 0, NULL, NULL);
    Même si je le fais par les fonctions netbios, je suis toujours intéressé pour savoir comment on fait par WMI. Chez moi ça ne fonctionne pas bien mais je crois que c'est parce que les services WMI ne sont pas installés. Ce qui est gênant pour mon application actuelle. Je préfère ne pas dépendre de service externe au programme.

  10. #10
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Voici ou j'en suis pour l'instant ton dernier exemple m'a permis d'avancer
    le.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
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include "WbemScripting_OCX.h"
    #include "WMIEXTENSIONLib_OCX.h"
    #include <OleServer.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TButton *Button1;
            TSWbemLocator *SWbemLocator1;
            TSWbemNamedValueSet *SWbemNamedValueSet1;
            TSWbemObjectPath *SWbemObjectPath1;
            TSWbemLastError *SWbemLastError1;
            TSWbemSink *SWbemSink1;
            TSWbemDateTime *SWbemDateTime1;
            TSWbemRefresher *SWbemRefresher1;
            TWMIExtension *WMIExtension1;
            void __fastcall Button1Click(TObject *Sender);
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    le .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
    44
    45
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    //#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>
     
    # pragma comment(lib, "wbemuuid.lib")
    #pragma link "WMIEXTENSIONLib_OCX"
    #pragma link "WbemScripting_OCX"
    #pragma link "WMIEXTENSIONLib_OCX"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //SWbemServices *WMIService;
    //TSWbemLocator *WMILocator;
    //SWbemObjectSet *WMIObjectSet;
    TCursor OldCursor;
    //WMILocator = new TSWbemLocator(this);
    Variant WMILocator = Variant::CreateObject("WbemScripting.SWbemLocator");
    OldCursor = Screen->Cursor;
    Screen->Cursor = crSQLWait;
    Variant WMIService = WMILocator.OleFunction("ConnectServer", (".", L"root\\cimv2", NULL, NULL, NULL, NULL, wbemConnectFlagUseMaxWait, NULL));
    WMIService.OleFunction("InstancesOf", ("Win32_OperatingSystem", wbemFlagReturnWhenComplete, NULL));
    WMILocator = "Free";
    Screen->Cursor = OldCursor;
    }
    //---------------------------------------------------------------------------
    j'ai installe les deux OCX conformement au Tuto Delphi, et dans le dossier du programme j'ai inclus " wbemuuid.lib "

  11. #11
    Membre confirmé
    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
    Points : 523
    Points
    523
    Par défaut
    En fouillant dans l'historique de mon code, j'ai retrouvé le code :

    Dans le fichier .h, c'est issue du code de cedni.
    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
    #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>
     
     
     // 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;
        if(pWbemLocator->ConnectServer(L"root\\cimv2", NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
        {
          IEnumWbemClassObject *pEnumClassObject = NULL;
          UnicodeString wsQuery="Select * from "+wsClass;
          if(pWbemServices->ExecQuery(L"WQL", wsQuery.c_str(), WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
          {
            IWbemClassObject *pClassObject = NULL;
            ULONG uCount = 1, uReturned;
            if(pEnumClassObject->Reset() == S_OK)
            {
                  long vbl, vbu , idx;
              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)
                {
                  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();
    }
    Dans le fichier cpp, je ne suis pas sur que c'est le bon code :
    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
    SWbemServices *WmiService;
    SWbemObject *WmiObjet;
    SWbemObjectSet *wmiObjetSet;
    IEnumVARIANT *ObjectEnumerator;
    OleVariant ArrayVariant;
    unsigned long NumberItem;
    TSWbemLocator *WMILocator;
     
    UnicodeString Result = "";
    WMILocator = new TSWbemLocator(this);
    try {
        try {
            WMILocator->Security_->set_AuthenticationLevel(WbemImpersonationLevelEnum::wbemImpersonationLevelImpersonate);
            WMILocator->Security_->set_AuthenticationLevel(WbemAuthenticationLevelEnum::wbemAuthenticationLevelDefault);
            WmiService = WMILocator->ConnectServer(L".", L"ROOT\CIMV2", L"", L"", L"", L"", 0, NULL);
            }
        catch (EOleException &E)
              {
    /*          ShowMessage(SysErrorMessage(E.ErrorCode)+" ["+IntToHex(E.ErrorCode,8)+"] "+E.Message);
              Raise();*/
              }
        WmiService->Security_->Privileges->Add(WbemPrivilegeEnum::wbemPrivilegeShutdown, true);
        wmiObjetSet = WmiService->ExecQuery(L"Select * from Win32_NetworkAdapterConfiguration",
                                            L"WQL", WbemFlagEnum::wbemFlagReturnImmediately, NULL);
        ObjectEnumerator = (IEnumVARIANT *)(wmiObjetSet->_NewEnum);
        while (ObjectEnumerator->Next(1, ArrayVariant, &NumberItem) == S_OK)
              {
              WmiObjet  = (SWbemObject *)(IUnknown*)(ArrayVariant);
              if (bool(WmiObjet->Properties_->Item(L"IPEnabled", 0)->get_Value()))
                 {
                 Result = VarToStr(WmiObjet->Properties_->Item(L"MACAddress", 0)->get_Value());
                 }
              }
        }
    __finally {
              delete WMILocator;
              }
    return Result;
    J'ai ajouté au projet le fichier obj qui a été créé par l'import du fichier tlb.

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

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

    Je me suis penché dessus
    Donc c est pas tres compliqué , fallait juste le savoir
    J ai tenté d executer ce code sur xp , negatif , que des zero
    Je l avais ecrit sous seven , il me semble

    le veritable probleme est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                         seven       xp
    macadress            18         16
    name                 32         20
    Il suffit donc de ne pas definir ces nombres mais d obtenir leur valeur en interogeant WMI
    Pour celà

    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
    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
    //---------------------------------------------------------------------------
     
    #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;
     
    int NbrRunUser;
    int NbrRunLocal;
    int ItemSelectV;
    int ItemSelectN;
    int ItemSelectC;
    int ClickSystemCheck = 0;
    int PeriphSystemCheck = 0;
    int NbrSystemCheck = 0;
     
    TStringList *SystemCheck = new TStringList();   
     
     
    //---------------------------------------------------------------------------
    __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)
    {
    TStringList *Test = new TStringList();
    TStringList *ListeDistincteTest = new TStringList();
    TStringList *ResultTest = new TStringList();
    AnsiString Matos =  "Win32_NetworkAdapter" ;
    int NbrSystemCheckViewLb = Test->Count;
    GetWmiInfos(Test, AnsiReplaceText(Matos, " ", "Win32_"),0,0);
     
            for( int i=1   ; i< Test->Count; i++ )
           {
           if ( Test->Strings[i]=="MACAddress" ||  Test->Strings[i]=="Name" )
                  { ResultTest->Add(i) ;    }}
     
    for( int i=0   ; i< ResultTest->Strings[2].ToInt()-ResultTest->Strings[0].ToInt(); i++ )
    LB0->Items->Add(Test->Strings[i]);
     
    TStringList *MACAdress = new TStringList();
    TStringList *ProductName = new TStringList();
    GetWmiInfos(MACAdress   , AnsiReplaceText(Matos, " ", "Win32_"),ResultTest->Strings[0].ToInt() ,1  );
    GetWmiInfos(ProductName , AnsiReplaceText(Matos, " ", "Win32_"),ResultTest->Strings[1].ToInt() ,1  );
     
    for( int i=0   ; i< MACAdress->Count; i++ )
           {if ( MACAdress->Strings[i].Length() !=0 )
                  { LB1->Items->Add(ProductName->Strings[i]);
                    LB1->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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    //---------------------------------------------------------------------------
     
    #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
            TListBox *LB0;
            TButton *Button1;
            TListBox *LB1;
            TListBox *LBcat;
            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 GetWmiInfos(TStrings *lpList, WideString wsClass , long id  , int VarVer)
    {
      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);
                  if (VarVer==0)
                  {
                  for(long idx=vbl; idx<=vbu; idx++)
                  {
                    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));
                      //lpList->Add(AnsiString(wsName)+"="+s);
                    }
                  VariantClear(&vValue);
                  SysFreeString(wsName);
                  }}  //////////////////////////////////////////
     
    if (VarVer==1)
                  {
                  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

+ 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