C++ Builder Snippets  

MAC-Adressen der im PC installierten Netzwerkkarten bestimmen:

Vielen Dank an Sven Ilius für die Korrektur des ursprünglichen Snippet-Codes !
//---------------------------------------------------------------------------
// Funktion GetMacAddresses() schreibt die MAC-Adressen (MAC=Media Access
// Control) der im PC installierten Netzwerkkarten im Format xx-xx-xx-xx-xx-xx
// in die übergebene TStrings-Instanz. Die Funktion gibt die Anzahl der
// gefundenen Netzwerk-Adapter zurück.
// Um nur die Anzahl der MAC-Adressen zu ermitteln, kann der Funktion
// im Parameter pslStrings ein NULL-Zeiger übergeben werden.
//
// Aufrufbeispiele:
//
// /* schreiben aller Rechner-MACs in eine ListBox: */
// GetMacAddresses(ListBox1-Items)
//
// /* schreiben aller Rechner-MACs in die TStringList pslStrings: */
// GetMacAddresses(pslStrings);
//---------------------------------------------------------------------------
#include <nb30.h>

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


int GetMacAddresses(TStrings* pslStrings)
{
  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

  if(pslStrings != NULL) pslStrings->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(pslStrings != NULL)
  {
    for(int ilAdapter=0; ilAdapter < ilRetVal; ilAdapter++)
    {
      memset(&stNetCtrlBlock, 0, sizeof(stNetCtrlBlock));
      stNetCtrlBlock.ncb_command = NCBRESET;
      stNetCtrlBlock.ncb_lana_num =   stLanEnum.lana[ilAdapter] ;
      Netbios(&stNetCtrlBlock);
      memset( &stNetCtrlBlock, 0, sizeof(stNetCtrlBlock) );
      stNetCtrlBlock.ncb_command = NCBASTAT;
      stNetCtrlBlock.ncb_lana_num =   stLanEnum.lana[ilAdapter] ;
      strcpy(stNetCtrlBlock.ncb_callname,"*               ");
      stNetCtrlBlock.ncb_length = sizeof(stAdapterStatus);
      //stNetCtrlBlock.buffer = (UCHAR *)&stAdapterStatus.adapt;
      pASTAT=HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|
        HEAP_ZERO_MEMORY, stNetCtrlBlock.ncb_length);

      if(pASTAT != NULL)
      {
        stNetCtrlBlock.ncb_buffer=(UCHAR *)pASTAT;
        Netbios(&stNetCtrlBlock);
        CopyMemory(&stAdapterStatus,stNetCtrlBlock.ncb_buffer,
          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);
        pslStrings->Add(slMacAddress);
      }
      else ilRetVal = 0;
    }
  }
  return ilRetVal;
}



© '99-2003 by S. Kreutzmann