Newsgroup: it.comp.lang.c++
Titolo: aiutino per MAC address

Salve a tutti!
ringrazio anticipatamente chi mi potrà aiutare o dedicare
un attimo del suo tempo ;)
mi sto perdendo nella ricerca di codice c o c++ in grado
di restituirmi il mac address della macchina su cui viene
lanciato.
l'ideale sarebbe un'api di windows richiamabile da CENTURA/GUPTA,
altrimenti mi basterebbe creare una dll che alla chiamata restituisce
il mac del pc e chiamare quella da centura...
ho trovato un paio di alterntive funzionanti se messe in un progetto
c++ ma il problema è quando le metto in un progetto DLL che non
riesco a farle funzionare per una miriade di errori...
purtroppo sono molto arrugginito... non vedo C da anni :D
qualcuno mi sa aiutare?
se avete qualche alternativa già testata o mi sapete indirizzare vi 
ringrazio infinitamente, altrimenti posto il codice che ho rimediato io.
penso comunque che il problema sia soprattutto imparare a scrivere bene
una dll ;)
Grazie mille
Francesco

Paganelli Francesco ha scritto:

nello specifico il codice che mi funziona da progetto CPP è questo:
INIZIO
//---------------------------------------------------------------------------
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
#define bzero(thing,sz) memset(thing,0,sz)
#define MyDll __declspec(dllexport)
extern MyDll bool GetAdapterInfo(int adapter_num, string &mac_addr);
MyDll bool GetAdapterInfo(int adapter_num, string &mac_addr)
{
     // 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 += string((char *)Ncb.ncb_retcode);
     return false;
   }
   // Prepare to get the adapter status block
   bzero(&Ncb,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;
   bzero(&Adapter,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 += string((char *)Ncb.ncb_retcode);
     return false;
   }
}
int main()
{
   // 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
   string mac_addr;
   for (int i = 0; i < AdapterList.length - 1; ++i)
   {
     if (GetAdapterInfo(AdapterList.lana[i], mac_addr))
     {
       cout << "Adapter " << int (AdapterList.lana[i]) <<
               "'s MAC is " << mac_addr << endl;
     }
     else
     {
       cerr << "Failed to get MAC address! Do you" << endl;
       cerr << "have the NetBIOS protocol installed?" << endl;
       break;
     }
   }
   return 0;
}
//---------------------------------------------------------------------------
FINE
il problema è se lo incollo in una dll che mi da questo output:
--------------------Configuration: mad - Win32 Debug--------------------
Compiling...
mad.cpp
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(101) : error C2065: 'NCB' : undeclared identifier
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(101) : error C2146: syntax error : missing ';' 
before identifier 'Ncb'
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(101) : error C2065: 'Ncb' : undeclared identifier
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(103) : error C2228: left of '.ncb_command' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(103) : error C2065: 'NCBRESET' : undeclared identifier
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(104) : error C2228: left of '.ncb_lana_num' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(105) : error C2065: 'Netbios' : undeclared identifier
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(105) : error C2065: 'NRC_GOODRET' : undeclared 
identifier
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(107) : error C2228: left of '.ncb_retcode' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(113) : error C2228: left of '.ncb_command' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(113) : error C2065: 'NCBASTAT' : undeclared identifier
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(114) : error C2228: left of '.ncb_lana_num' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(115) : error C2228: left of '.ncb_callname' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(118) : error C2146: syntax error : missing ';' 
before identifier 'adapt'
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(118) : error C2501: 'ADAPTER_STATUS' : missing 
storage-class or type specifiers
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(118) : error C2501: 'adapt' : missing storage-class 
or type specifiers
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(119) : error C2146: syntax error : missing ';' 
before identifier 'NameBuff'
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(119) : error C2501: 'NAME_BUFFER' : missing 
storage-class or type specifiers
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(119) : error C2501: 'NameBuff' : missing 
storage-class or type specifiers
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(122) : error C2228: left of '.ncb_buffer' must have 
class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(123) : error C2228: left of '.ncb_length' must have 
class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(131) : error C2039: 'adapt' : is not a member of 
'ASTAT'
         C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(117) : see declaration of 'ASTAT'
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(131) : error C2228: left of '.adapter_address' must 
have class/struct/union type
C:\Documents and Settings\Francesco\Desktop\DLL MAC e 
sessione\mad\mad.cpp(131) : fatal error C1903: unable to recover from 
previous error(s); stopping compilation
Error executing cl.exe.
mad.dll - 24 error(s), 0 warning(s)
spero di non aver fatto troppa confusione

> Francesco
Ciao,
Non troverai nessuna risposta in questo NG dato che questo si occupa di C++
Standard. Qui c'è gente che, come me, non sa nulla delle API Windows.
Nel tuo codice sono presenti errori di sintassi C++, ma risolverli in questa
fase servirebbe a poco. Da una veloce lettura dei messaggi del compilatore
è chiaro che la maggior parte degli errori vengono fuori da un uso non
corretto delle suddette API e dei tipi messi a disposizione.
Puoi trovare aiuto su qualche NG dedicato alla programmazione sul tuo
sistema operativo. Credo che uno di questi si chiami
it.comp.programmare.win32.
Solo dopo esserti assicurato di padroneggiare l'utilizzo delle suddette API,
se dovessi ancora avere errori di sintassi e/o logici strettamente legati
all'uso del linguaggio, oppure vorrai consigli su quale strumento standard
del linguaggio può risolvere un preciso problema, allora potrai rivolgerti
a questo NG ottenendo sicuramente un valido aiuto.
Buon lavoro.
fabio de francesco

#include <string>
Aggiungi:
#include <Nb30.h>