Announcement

Collapse
No announcement yet.

MAC-Adresse ermiteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MAC-Adresse ermiteln

    Hallo

    Wie kann ich die MAC-Adresse meines PC's mit C++ ermiteln.
    Die Variante über das IPX Protokoll kenne ich bereits. Ich möchte das mein Programm unabhängig vom Protokoll, das auf dem PC installiert ist, die MAC-Adresse ermitelt. Irgendwie über die Hardware.
    Das ganze sollte unter WinNT/W2k und Win9x funktionieren.

    Kennt jemand eine Lösung für dieses Problem?
    Ich bin für jeden hinweis dankbar.

    Mfg
    Marco Vergari

  • #2
    Erstellt im C++ Builder:
    Ausgabe erfolgt in einer ListBox (Lst_MAC)

    int __fastcall TForm1::GetMacAddresses()
    {
    int ilRetVal = 0; // Rückgabewert
    NCB stNetCtrlBlock; // Network Control Block - Instanz
    LPVOID pASTAT; // Zeiger auf die ASTAT-Struktur
    ASTAT stAdapterStatus; // AdapterStatus-Struktur
    LANA_ENUM stLanEnum; // Struktur für die Enumerierung der
    // Netzwerkkarten

    Mac.h:

    //---------------------------------------------------------------------------
    #ifndef Mac1H
    #define Mac1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <nb30.h>
    #include <Forms.hpp>

    typedef struct _ASTAT
    {
    ADAPTER_STATUS adapt;
    NAME_BUFFER NameBuff[30];
    } ASTAT;

    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // Komponenten, die von der IDE verwaltet werden
    TListBox *Lst_MAC;
    TLabel *Label1;
    void __fastcall FormCreate(TObject *Sender);
    private: // Benutzerdeklarationen
    public: // Benutzerdeklarationen
    __fastcall TForm1(TComponent* Owner);
    int __fastcall GetMacAddresses(void);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //------------

    Lst_MAC->Clear();

    // die Anzahl der Netzwerkkarten ermitteln:
    memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
    stNetCtrlBlock.ncb_command = NCBENUM;
    stNetCtrlBlock.ncb_buffer = (UCHAR *)&stLanEnum;
    stNetCtrlBlock.ncb_length = sizeof(stLanEnum);
    Netbios(&stNetCtrlBlock);
    ilRetVal = stLanEnum.length;

    // Falls Zeiger auf TStrings-Instanz übergeben, MAC-Adressen
    // auslesen und in die Stringliste einfügen:
    if(Lst_MAC->Items->Count == 0)
    {
    for(int ilAdapter=0; ilAdapter < ilRetVal; ilAdapter++)
    {
    stNetCtrlBlock.ncb_command = NCBRESET;
    Netbios(&stNetCtrlBlock);
    strcpy(stNetCtrlBlock.ncb_callname,"* ");
    stNetCtrlBlock.ncb_command = NCBASTAT;
    stNetCtrlBlock.ncb_lana_num = ilAdapter;
    stNetCtrlBlock.ncb_length = sizeof(stAdapterStatus);

    pASTAT=HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EX CEPTIONS|
    HEAP_ZERO_MEMORY, stNetCtrlBlock.ncb_length);

    if(pASTAT != NULL)
    {
    stNetCtrlBlock.ncb_buffer=(UCHAR *)pASTAT;
    Netbios(&stNetCtrlBlock);
    CopyMemory(&stAdapterStatus,stNetCtrlBlock.ncb_buf fer,
    sizeof(stAdapterStatus));
    AnsiString slMacAddress;
    for(int i =0; i < 6; i++)
    {
    slMacAddress += IntToHex(stAdapterStatus.adapt.adapter_address[i],2);
    if(i<5) slMacAddress+=":";
    }
    HeapFree(GetProcessHeap(),0,pASTAT);
    Lst_MAC->Items->Add(slMacAddress);
    }
    else ilRetVal = 0;
    }
    }
    return ilRetVal;

    Comment

    Working...
    X