20
May 08

Delphi: AdapterMacAddress

:: articles :: by Gilberto Saraiva

Camaradas,

Muitos aqui devem ter vivido o problema de obter o endereço MAC de um adaptador de rede wireless, quando o mesmo está desativado.

Eu escrevi uma pequena função que obtem o MAC Address mesmo que o adaptador indicado esteje desativado.
Então vamos lá:

 Delphi |  copy code |? 
01
function AdapterMacAddress(AAdptNum: Cardinal): string;
02
type
03
  PC = PCardinal;
04
  PB = PByte;
05
var
06
  hLib: HMODULE;
07
  { Note: Type from IpHlpApi GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
08
    var pOutBufLen: ULONG): DWORD; stdcall;
09
  }
10
  GetAdptInfo: function(A: Pointer; var B: ULONG): DWORD; stdcall;
11
  i, Size, Buff: Cardinal;
12
begin
13
  Result := '-----';
14
  hLib := LoadLibrary('iphlpapi.dll');
15
  if hLib <> 0 then
16
    try
17
      @GetAdptInfo := GetProcAddress(hLib, 'GetAdaptersInfo');
18
      Size := 0;
19
      if GetAdptInfo(nil, Size) = 111 then
20
      begin
21
        GetMem(Pointer(Buff), Size);
22
        try
23
          if GetAdptInfo(Pointer(Buff), Size) = 0 then
24
            for I := PC(Buff + (640 * AAdptNum) + 400)^ - 1 downto 0 do
25
              Insert(IntToHex(PB(Buff + (640 * AAdptNum) + 404 + I)^, 2),
26
                Result, I + 1);
27
        finally
28
          FreeMem(Pointer(Buff));
29
        end;
30
      end;
31
    finally
32
      FreeLibrary(hLib);
33
    end;
34
end;

Escrevi esse código pra não ter dependências a outras Units, mas como alguns aqui devem saber,
tudo que escrevi é baseado na Biblioteca em anexo, a IpHlpApi.

Para os curiosos vale a pena dar uma olhada nessa Lib.

Agora o mais interessante – Como usar a função acima?
Adicione um TMemo no form(coloquei o name de ‘mmoMACs’).

 Delphi |  copy code |? 
1
  mmoMACs.Lines.Add(AdapterMacAddress(0));
2
  mmoMACs.Lines.Add(AdapterMacAddress(1));

Nesse exemplo eu pego o MAC Address do primeiro e do segundo adaptador.
O retorno aqui ficou:
00-19-DB-9D-D0-4F
00-03-0D-7A-5D-40

Respectivamente, Placa de Rede a Cabo e Placa de Rede Wireless(Desativada no switch do notebook [OFF])

Obs: Lembre-se que em programação iniciamos contagem do 0, então de 0 a 10 temos 11 elementos.

Abraço a todos