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.
相關文章
相關標籤/搜索