delphi 获取网卡信息(支持多网卡) unit LGetAdapterInfo; interface uses Windows, SysUtils, Classes; 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 AnsiChar; 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 AnsiChar; DomainName: array[0..MAX_DOMAIN_NAME_LEN + 3] of AnsiChar; CurrentDNSServer: PIPAddrString; DNSServerList: TIPAddrString; NodeType: Integer; ScopeId: array[0..MAX_SCOPE_ID_LEN + 3] of AnsiChar; 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 AnsiChar; Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of AnsiChar; 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; TAdapterInfo = class(TObject) Index: Integer; //序号 AdapterName: string; //网卡名 IPAddress: string; //IP地址 Subnetmask: string; //子网掩码 Gateway: string; //网关 MacAddress: string; //MAC地址 DHCP: Boolean; //是否是自动分配 DHCPServer: string; //DHCP服务器地址 end; function SendARP(ipaddr: ulong; temp: dword; ulmacaddr: pointer; ulmacaddrleng: pointer): DWord; StdCall; function GetAdapterInfo: TList; var AI, Work: PIPAdapterInfo; Size: Integer; Res: Integer; I: Integer; implementation function SendARP; external 'Iphlpapi.dll' Name 'SendARP'; function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: Integer): Integer; stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo'; 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 between12/31/1899and 1/1/1970 } var DT: TDateTime; TZ: TTimeZoneInformation; Res: DWord; begin if (TimeT = 0) then Result := '' else begin { Unix TIME_T is secs since1/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; function GetAdapterInfo: TList; var AAdapterInfo: TAdapterInfo; AAdapterInfos: TList; begin Size := 5120; GetMem(AI, Size); Res := GetAdaptersInfo(AI, Size); if (Res <> ERROR_SUCCESS) then begin SetLastError(Res); RaiseLastWin32Error; end; Work := AI; I := 1; AAdapterInfos := TList.Create; repeat AAdapterInfo := TAdapterInfo.Create; AAdapterInfo.Index := I; AAdapterInfo.AdapterName := Work^.Description; AAdapterInfo.IPAddress := Copy(GetAddrString(@Work^.IPAddressList), Pos('A: ', GetAddrString(@Work^.IPAddressList)) + 3, Pos(' M: ', GetAddrString(@Work^.IPAddressList)) - Pos('A: ', GetAddrString(@Work^.IPAddressList)) - 3); AAdapterInfo.Subnetmask := Copy(GetAddrString(@Work^.IPAddressList), Pos(' M: ', GetAddrString(@Work^.IPAddressList)) + 4, length(GetAddrString(@Work^.IPAddressList))); AAdapterInfo.Gateway := Copy(GetAddrString(@Work^.GatewayList), Pos('A: ', GetAddrString(@Work^.GatewayList)) + 3, Pos(' M: ', GetAddrString(@Work^.GatewayList)) - Pos('A: ', GetAddrString(@Work^.GatewayList)) - 3); AAdapterInfo.MacAddress := MACToStr(@Work^.Address, Work^.AddressLength); AAdapterInfo.DHCP := Work^.DHCPEnabled > 0; AAdapterInfo.DHCPServer := Copy(GetAddrString(@Work^.DHCPServer), Pos('A: ', GetAddrString(@Work^.DHCPServer)) + 3, Pos(' M: ', GetAddrString(@Work^.DHCPServer)) - Pos('A: ', GetAddrString(@Work^.DHCPServer)) - 3); AAdapterInfos.Add(AAdapterInfo); Inc(I); Work := Work^.Next; until (Work = nil); Result :=AAdapterInfos; FreeMem(AI); end; end. 使用方法 : procedure TForm1.Button2Click(Sender: TObject); var aa:TList; i :Integer; begin aa :=GetAdapterInfo; for i := 0 to aa.Count - 1 do begin Memo1.Lines.Add(TAdapterInfo(aa.Items[i]).AdapterName); end; end;