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 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;

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;

相关阅读 >>

Delphi ip编辑控件

Delphi 多核机器上编程实现将指定进程pid放到指定cpu上运行

Delphi 10.4 自定义托管记录

Delphi从内存流中判断图片格式

Delphi 小数点四舍五入问题

Delphi qq自动发消息源码

Delphi设置屏幕分辨率的函数

Delphi pascal实现二分查找算法

Delphi tms web core webhttprequest1 解析json

Delphi wmi获取网卡mac

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...