Newsgroup: it.comp.lang.delphi
Titolo: GetMacAddress

salve a tutti,
ho trovato una funzione in rete che legge il MacAddress della scheda di rete, l'ho inserita in una applicazione Delphi XE e con Windows 7 32 bit funziona regolarmente, su Windows 8 64 bit non legge nulla. Avete notizie di problemi e compatibilità fra i due s.o. ?
Grazie
Fabio

 Avete notizie di problemi e compatibilità fra i due s.o. ?
 
Certo su win8 hai RT che non c'entra un kazzen con win32/64....
Ma se tu usi "win7" su "win8" non ci dovrebbero essere casini.
 
 
A.


Hai ragione scusa ... ma non avevo sottomano il sorgente :
 
----------------------------------------
function GetMACAddress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;
 
  URetCode: PChar;
  RetCode: Ansichar;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string;
begin
  Result    := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);
 
  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);
 
  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);
 
  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM);
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);
 
  i := 0;
  repeat
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[I];
    RetCode          := Netbios(Ncb);
 
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[I];
    // Must be 16
    Ncb.ncb_callname := '*               ';
 
    Ncb.ncb_buffer := Pointer(Adapter);
 
    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = chr(0)) or (RetCode = chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(i);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAddress := _SystemID;
end;
-------------------------------------------
 
Per ora l'ho provata solo su Win 7 32 bit.
 
Il Win 8 in cui l'ho testata è win 64.
Al momento non posso riprovarla per testare il GetLastError.
 
Alternative da suggerire per realizzare una semplice procedura che evitarei l'installazione del programma su altri pc ??
 
Grazie
 
F.
 
 
 

Nessuno che può aiutarmi?
Grazie
F.

..l'unica cosa che mi viene in mente è che il codice che hai postato usa Netbios.
Si potrebbe provare a leggere il MAC usando WMI e vedere cosa succede.
 
A.

hai provato con la libreria JVCL?
ha una funzione function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer; 
nel file JclSysInfo
io non posso provare non ho istallato W8, ciao Brunello

Portarsi dietro un terabyte di JVCL per leggere un mac address?? :-|
Tutto per non usare direttamente le chiamate a Netbios o WMI?
 
 
A.

 
alternativa lite se funziona per vedere quale approccio hanno usato

 alternativa lite se funziona per vedere quale approccio hanno usato
 
ok grazie a tutti adesso faccio un po' di prove.
F.