Delphi获取Mac地址方法

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSock;

const
  MAX_HOSTNAME_LEN = 128; { from IPTYPES.H }
  MAX_DOMAIN_NAME_LEN = 128;
  MAX_SCOPE_ID_LEN = 256;
  MAX_ADAPTER_NAME_LENGTH = 256;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  MAX_ADAPTER_ADDRESS_LENGTH = 8;

type
  TIPAddressString = array[0..4 * 4 - 1] of Char;
  PIPAddrString = ^TIPAddrString;
  TIPAddrString = record
    Next: PIPAddrString;
    IPAddress: TIPAddressString;
    IPMask: TIPAddressString;
    Context: Integer;
  end;
  PFixedInfo = ^TFixedInfo;
  TFixedInfo = record { FIXED_INFO }
    HostName: array[0..MAX_HOSTNAME_LEN + 3] of Char;
    DomainName: array[0..MAX_DOMAIN_NAME_LEN + 3] of Char;
    CurrentDNSServer: PIPAddrString;
    DNSServerList: TIPAddrString;
    NodeType: Integer;
    ScopeId: array[0..MAX_SCOPE_ID_LEN + 3] of Char;
    EnableRouting: Integer;
    EnableProxy: Integer;
    EnableDNS: Integer;
  end;
  PIPAdapterInfo = ^TIPAdapterInfo;
  TIPAdapterInfo = record { IP_ADAPTER_INFO }
    Next: PIPAdapterInfo;
    ComboIndex: Integer;
    AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
    Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
    AddressLength: Integer;
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
    Index: Integer;
    _Type: Integer;
    DHCPEnabled: Integer;
    CurrentIPAddress: PIPAddrString;
    IPAddressList: TIPAddrString;
    GatewayList: TIPAddrString;
    DHCPServer: TIPAddrString;
    HaveWINS: Bool;
    PrimaryWINSServer: TIPAddrString;
    SecondaryWINSServer: TIPAddrString;
    LeaseObtained: Integer;
    LeaseExpires: Integer;
  end;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure GetAdapterInformation;
    procedure GetAdapterInformation2;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: Integer): Integer;
  stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo';

function SendArp(ipaddr: ulong; temp: dword; ulmacaddr: pointer; ulmacaddrleng: pointer): dword;
  stdcall; external 'Iphlpapi.dll' Name 'SendARP';


procedure TForm1.GetAdapterInformation;
var
  AI, Work: PIPAdapterInfo;
  Size: Integer;
  Res: Integer;
  I: Integer;
  function MACToStr(ByteArr: PByte; Len: Integer): string;
  begin
    Result := '';
    while (Len > 0) do begin
      Result := Result + IntToHex(ByteArr^, 2) + '-';
      ByteArr := pointer(Integer(ByteArr) + SizeOf(Byte));
      Dec(Len);
    end;
    SetLength(Result, Length(Result) - 1); { remove last dash }
  end;
  function GetAddrString(Addr: PIPAddrString): string;
  begin
    Result := '';
    while (Addr <> nil) do begin
      Result := Result + 'A: ' + Addr^.IPAddress + ' M: ' + Addr^.IPMask + #13;
      Addr := Addr^.Next;
    end;
  end;
  function TimeTToDateTimeStr(TimeT: Integer): string;
  const UnixDateDelta = 25569; { days between 12/31/1899 and 1/1/1970 }
  var
    DT: TDateTime;
    TZ: TTimeZoneInformation;
    Res: dword;
  begin
    if (TimeT = 0) then Result := ''
    else begin
      { Unix TIME_T is secs since 1/1/1970 }
      DT := UnixDateDelta + (TimeT / (24 * 60 * 60)); { in UTC }
      { calculate bias }
      Res := GetTimeZoneInformation(TZ);
      if (Res = TIME_ZONE_ID_INVALID) then RaiseLastWin32Error;
      if (Res = TIME_ZONE_ID_STANDARD) then begin
        DT := DT - ((TZ.Bias + TZ.StandardBias) / (24 * 60));
        Result := DateTimeToStr(DT) + ' ' + WideCharToString(TZ.StandardName);
      end
      else begin { daylight saving time }
        DT := DT - ((TZ.Bias + TZ.DaylightBias) / (24 * 60));
        Result := DateTimeToStr(DT) + ' ' + WideCharToString(TZ.DaylightName);
      end;
    end;
  end;
begin
  Memo1.Lines.Clear;
  Size := 5120;
  GetMem(AI, Size);
  Res := GetAdaptersInfo(AI, Size);
  if (Res <> ERROR_SUCCESS) then begin
    SetLastError(Res);
    RaiseLastWin32Error;
  end;
  with Memo1, Lines do begin
    Work := AI;
    I := 1;
    repeat
      Add('');
      Add('Adapter ' + IntToStr(I));
      Add(' ComboIndex: ' + IntToStr(Work^.ComboIndex));
      Add(' Adapter name: ' + Work^.AdapterName);
      Add(' Description: ' + Work^.Description);
      Add(' Adapter address: ' + MACToStr(@Work^.Address, Work^.AddressLength));
      Add(' Index: ' + IntToStr(Work^.Index));
      Add(' Type: ' + IntToStr(Work^._Type));
      Add(' DHCP: ' + IntToStr(Work^.DHCPEnabled));
      Add(' Current IP: ' + GetAddrString(Work^.CurrentIPAddress));
      Add(' IP addresses: ' + GetAddrString(@Work^.IPAddressList));
      Add(' Gateways: ' + GetAddrString(@Work^.GatewayList));
      Add(' DHCP servers: ' + GetAddrString(@Work^.DHCPServer));
      Add(' Has WINS: ' + IntToStr(Integer(Work^.HaveWINS)));
      Add(' Primary WINS: ' + GetAddrString(@Work^.PrimaryWINSServer));
      Add(' Secondary WINS: ' + GetAddrString(@Work^.SecondaryWINSServer));
      Add(' Lease obtained: ' + TimeTToDateTimeStr(Work^.LeaseObtained));
      Add(' Lease expires: ' + TimeTToDateTimeStr(Work^.LeaseExpires));
      Inc(I);
      Work := Work^.Next;
    until (Work = nil);
  end;
  FreeMem(AI);
end;


procedure TForm1.GetAdapterInformation2;
var
  AI, Work: PIPAdapterInfo;
  Size: Integer;
  Res: Integer;
  I: Integer;
  function MACToStr(ByteArr: PByte; Len: Integer): string;
  begin
    Result := '';
    while (Len > 0) do begin
      Result := Result + IntToHex(ByteArr^, 2) + '-';
      ByteArr := pointer(Integer(ByteArr) + SizeOf(Byte));
      Dec(Len);
    end;
    SetLength(Result, Length(Result) - 1); { remove last dash }
  end;
begin
  Size := 5120;
  GetMem(AI, Size);
  Res := GetAdaptersInfo(AI, Size);
  if (Res <> ERROR_SUCCESS) then begin
    SetLastError(Res);
    RaiseLastWin32Error;
  end;
  Work := AI;
  I := 1;
  Edit1.text := Work^.Description + '   ' + MACToStr(@Work^.Address, Work^.AddressLength);
  FreeMem(AI);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetAdapterInformation;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  GetAdapterInformation2;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  myip: ulong;
  mymac: array[0..5] of Byte;
  mymaclength: ulong;
  r: Integer;
begin
  //myip := inet_addr(PChar('192.168.0.1'));
  myip := inet_addr(PChar('localhost'));
  mymaclength := Length(mymac);
  r := SendArp(myip, 0, @mymac, @mymaclength);
  Edit1.text := 'errorcode:' + IntToStr(r);
  Edit1.text := format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x', [mymac[0], mymac[1], mymac[2], mymac[3], mymac[4], mymac[5]]);
end;

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值