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 :

Adress MAC non trouvée


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut Adress MAC non trouvée
    Salut,

    J'essaie de trouver l'adresse MAC avec l'une des trois méthode proposé par Codegear from Borland : voici le lien :

    http://dn.codegear.com/article/26040

    ShowMessage(AdapterList.length); //====> retourne 0 !!!

    mon code est le suivant :

    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
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <strstream>
    #include <string>
     
    //---------------------------------------------------------------------------
    bool TGestionFrm::GetAdapterInfo(int nAdapterNum, string & sMAC)
    {
            NCB Ncb;
            memset(&Ncb, 0, sizeof(Ncb));
            Ncb.ncb_command = NCBRESET;
            Ncb.ncb_lana_num = nAdapterNum;
            if (Netbios(&Ncb) != NRC_GOODRET)
            {
                    char acTemp[80];
                    ostrstream outs(acTemp, sizeof(acTemp));
                    outs << "error " << Ncb.ncb_retcode << " on reset" << ends;
                    sMAC = acTemp;
                    return false;
            }
     
            memset(&Ncb, 0, sizeof(Ncb));
            Ncb.ncb_command = NCBASTAT;
            Ncb.ncb_lana_num = nAdapterNum;
            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);
     
           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]));
                    sMAC = acMAC;
                    return true;
           }
           else
           {
                    char acTemp[80];
                    ostrstream outs(acTemp, sizeof(acTemp));
                    outs << "error " << Ncb.ncb_retcode << " on ASTAT" << ends;
                    sMAC = acTemp;
                    return false;
           }
    }
    //------------------------------------------------------
    void __fastcall TGestionFrm::Button1Click(TObject *Sender)
    {
           using namespace std;
            //========= C++ Code : BEGIN =========
             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);
             string sMAC;
             cout << "MY INFO : AdapterList.length = " << static_cast<int>(AdapterList.length) << endl;
             ShowMessage(AdapterList.length); //====> retourne 0 !!!
             for (int i = 0; i < AdapterList.length; ++i)
             {
                    if (GetAdapterInfo(AdapterList.lana[i], sMAC))
                    {
                            ListBox1->Items->Add(sMAC.c_str());
                            cout << "Adapter " << int (AdapterList.lana[i]) << "'s MAC is " <<
                            sMAC << endl;
                    }
                    else
                    {
                            cerr << "Failed to get MAC address! Do you" << endl;
                            cerr << "have the NetBIOS protocol installed?" << endl;
                            break;
                    }
             }
             //return 0;
    }
    //---------------------------------------------------------------------------

    Si quelcun peut me dire pourquoi et comment je peux résoudre le problème.

    Merci.

  2. #2
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    On doit comprendre, je suppose, que c'est l'adresse MAC de la machine locale que tu cherches...
    Moi j'aurais plutôt utilisé l'api IPHLPAPI de Microsoft. Tu ajoutes dans ton Unit1.h la ligneet dans Unit1.cpp une ligne qui ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma link "C:\\Program Files\\Borland\\CBuilder5\\Lib\\PSDK\\iphlpapi.lib"
    et tu trouveras sur le site msdn tout ce qu'il faut pour parvenir à tes fins (en espérant que l'anglais ne te rebute pas mais c'est difficile d'y échapper quand on fait du réseau).

  3. #3
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour,
    ce code fonctionne parfaitement bien
    néanmoins il faut faire attention a ne pas utiliser (Cout et Cerr) qui fonctionnent uniquement en mode console
    ci dessous ton code avec quelques modifications
    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
     
    // le . h
    //---------------------------------------------------------------------------
     
    #ifndef Unit7H
    #define Unit7H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
     #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <strstream>
    #include <string>
    //---------------------------------------------------------------------------
    class TForm7 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    	TListBox *ListBox1;
    	TButton *Button1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Déclarations de l'utilisateur
    	 bool __fastcall GetAdapterInfo(int nAdapterNum, std::string & sMAC);
    public:		// Déclarations de l'utilisateur
    	__fastcall TForm7(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm7 *Form7;
    //---------------------------------------------------------------------------
    #endif
     
    // le .cpp
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
    #include "Nb30.h" // utilisé pour les déclarations NETBIOS
    #include "Unit7.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm7 *Form7;
    //---------------------------------------------------------------------------
    __fastcall TForm7::TForm7(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm7::Button1Click(TObject *Sender)
    {
    	 using namespace std;
    		//========= C++ Code : BEGIN =========
    		 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);
    		 string sMAC;
    	  //	 cout << "MY INFO : AdapterList.length = " << static_cast<int>(AdapterList.length) << endl;
    		 ShowMessage(AdapterList.length); //====> retourne 0 !!!
    		 for (int i = 0; i < AdapterList.length; ++i)
    		 {
    				if (GetAdapterInfo(AdapterList.lana[i], sMAC))
    				{
    						ListBox1->Items->Add(sMAC.c_str());
    						cout << "Adapter " << int (AdapterList.lana[i]) << "'s MAC is " <<
    						sMAC << endl;
    				}
    				else
    				{
    		  //				cerr << "Failed to get MAC address! Do you" << endl;
    		  //				cerr << "have the NetBIOS protocol installed?" << endl;
    						break;
    				}
    		 }
    		 //return 0;
    }
    //---------------------------------------------------------------------------
     
     
    //---------------------------------------------------------------------------
    bool __fastcall TForm7::GetAdapterInfo(int nAdapterNum, std::string & sMAC)
    {
    	   using namespace std;
    		NCB Ncb;
    		memset(&Ncb, 0, sizeof(Ncb));
    		Ncb.ncb_command = NCBRESET;
    		Ncb.ncb_lana_num = nAdapterNum;
    		if (Netbios(&Ncb) != NRC_GOODRET)
    		{
    				char acTemp[80];
    				ostrstream outs(acTemp, sizeof(acTemp));
    		  //		outs << "error " << Ncb.ncb_retcode << " on reset" << ends;
    				sMAC = acTemp;
    				return false;
    		}
     
    		memset(&Ncb, 0, sizeof(Ncb));
    		Ncb.ncb_command = NCBASTAT;
    		Ncb.ncb_lana_num = nAdapterNum;
    		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);
     
    	   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]));
    				sMAC = acMAC;
    				return true;
    	   }
    	   else
    	   {
    				char acTemp[80];
    				ostrstream outs(acTemp, sizeof(acTemp));
    				outs << "error " << Ncb.ncb_retcode << " on ASTAT" << ends;
    				sMAC = acTemp;
    				return false;
    	   }
    }
    //------------------------------------------------------
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Bonjour,

    Merci à touts ceux qui m'ont répondu.

    Mr DjmSoftware a dit :

    ce code fonctionne parfaitement bien
    La compilation se fait d'une façon normale, mais mon problème est :

    Le AdapterList.length retourne toujours 0, et le block

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (GetAdapterInfo(AdapterList.lana[i], sMAC))
    {
        ListBox1->Items->Add(sMAC.c_str());
        cout << "Adapter " << int (AdapterList.lana[i]) << "'s MAC is " <<
    						sMAC << endl;
    }
    else
    {
      //cerr << "Failed to get MAC address! Do you" << endl;
      //cerr << "have the NetBIOS protocol installed?" << endl;
      break;
    }
    ne s'exécutera jamais.

    Comment expliquer ça.

    Merci.

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Bonjour,

    ça fait cinq jour que j'ai posé ma question, si quelqu'un a une idée n'hésiter pas à me répondre. J'attend vos réponses.

    J'arrive pas à trouver l'adresse MAC de mon PC.

    Merci

  6. #6
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    Je t'ai donné, dans ma précédente réponse, un lien vers la page iphlpapi de msdn. Dans le lien GetAdaptersInfo, on peut y lire un exemple dans lequel on trouve ce que tu cherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .....
    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
      pAdapter = pAdapterInfo;
      while (pAdapter) {
        printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
        printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
        printf("\tAdapter Addr: \t");
        for (UINT i = 0; i < pAdapter->AddressLength; i++) {
          if (i == (pAdapter->AddressLength - 1))
             printf("%.2X\n",(int)pAdapter->Address[i]);
          else
            printf("%.2X-",(int)pAdapter->Address[i]);
        }
    ........
    si tu cherches, évidemment (comme Socrate)

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

Discussions similaires

  1. comment vider la table d'adresses mac d'un switch non manageable ?
    Par fourchette dans le forum Dépannage et Assistance
    Réponses: 12
    Dernier message: 13/10/2012, 14h44
  2. Obtenir l'adresse mac de sa carte reseau
    Par kivoch dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/11/2009, 18h30
  3. Réponses: 5
    Dernier message: 25/03/2003, 17h27
  4. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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