📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
MAX_ADAPTER_NAME_LENGTH= 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TIPAddressString = Array[0..4*4-1] of Char; //定义结构TIPADDRESSSTRING的数据类型是CHAR
PIPAddrString = ^TIPAddrString; //定义指针
TIPAddrString = Record //TIPAddrString的结构如下:
Next : PIPAddrString;
IPAddress : TIPAddressString;
IPMask : TIPAddressString;
End;
PIPAdapterInfo = ^TIPAdapterInfo; //定义指针 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;
end;
var
Form1: TForm1;
gatewaystr:string;
strlen:integer;
implementation
{$R *.dfm}
//得到 AdapterInfo 的信息-------------
Function GetAdaptersInfo(AI:PIPAdapterInfo; Var BufLen:Integer) : Integer;
StdCall; External 'iphlpapi.dll' Name 'GetAdaptersInfo';
//得到MAC地址----------------------------------
//将具有PBYTE类型的byetearr的长度为LEN的转换为字符串
Function MACToStr(ByteArr:PByte;Len:Integer) : String;
Begin
Result := '';
While (Len > 0) do
Begin
Result := Result+IntToHex(ByteArr^,2)+'-';
//showmessage(result);
ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte));
len:=len-1;
//showmessage(inttostr(len+1));
//len的长度从6变化到1----------------
End;
SetLength(Result,Length(Result)-1); { remove last dash }
end;
// 将 PIPAddrString 型的变量指向转换为STRING 型
Function GetAddrString(Addr:PIPAddrString) : String;
Begin
Result := '';
While (Addr <> nil) do
Begin
Result := Result+'IPAddress: '+Addr^.IPAddress+' MaskCode: '+Addr^.IPMask+#13;
// showmessage(Result);
Addr := Addr^.Next;
End;
End;
procedure TForm1.Button1Click(Sender: TObject);
var
AI,Work : PIPAdapterInfo;
Size : Integer;
Res : Integer;
i,j : integer;
sip : TIpAddressString;
begin
memo1.Lines.Clear;
Size := 5120;
GetMem(AI,Size);
work:=ai;
Res := GetAdaptersInfo(work,Size);
{
函数返回的当前计算机网络配置信息存在于第一个参数pAdapterInfo指向的IP_ADAPTER_INFO结构
函数返回的当前计算机网络配置信息存在于第一个参数pAdapterInfo指向的IP_ADAPTER_INFO结构,。
PIpAdapterInfo = ^TIpAdapterInfo;
TIP_ADAPTER_INFO = record
Next: PIpAdapterInfo; //链表指针域,通过它访问整个静态键表
ComboIndex: DWORD; //保留未用
AdapterName: //网卡名,max_adapter_name_length=256
array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
Description: //对网卡的描述max_adapter_description_length=128
array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
AddressLength: UINT; //物理地址的长度
Address: //物理地址,max_adapter_address_length=8每个字节存放一个十六进制的数
array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
Index: DWORD; //网卡索引号
Type_: UINT; //网卡类型
DhcpEnabled: UINT; //是否启用了DHCP动态IP分配
CurrentIpAddress: PIP_ADDR_STRING; //当前使用的IP地址
IpAddressList: IP_ADDR_STRING; //绑定到此网卡的IP地址链表
GatewayList: IP_ADDR_STRING; //网关地址链表
DhcpServer: IP_ADDR_STRING; //DHCP服务器地址,只有在DhcpEnabled==TRUE的情况下才有效
HaveWins: BOOL; //是否启用了WINS
PrimaryWinsServer: IP_ADDR_STRING; //主WINS地址
SecondaryWinsServer: IP_ADDR_STRING; //辅WINS地址
LeaseObtained: time_t; //当前DHCP租借获取的时间
LeaseExpires: time_t; //当前DHCP租借失效时间
end;
}
If (Res <> ERROR_SUCCESS) Then
Begin
SetLastError(Res);
RaiseLastWin32Error;
End;
//----------------------------------------------------------
//showmessage(inttostr(Work^.AddressLength));
//Work^.AddressLength 是6
repeat
memo1.Lines.Add ('Adapter address: '+MACToStr(@Work^.Address,Work^.AddressLength));
memo1.Lines.add(GetAddrString(@Work^.IPAddressList));
//就是下面这个gatewaystr网关的值总是为空!!!!
// if work^.GatewayList.IPAddress<>'#0' then
//gatewaystr:=work^.GatewayList.IPAddress;
// memo1.Lines.Add('gateway address:'+gatewaystr);
//------------------------------------------------------------------
j:=0;
for i:= 0 to 19 do
begin
if work^.GatewayList.IPAddress[i]<>#0 then
begin
sip[j]:= work^.GatewayList.IPAddress[i];
inc(j);
end;
sip[j]:=#0;
gatewaystr:=String(sip);
end;
memo1.Lines.Add('gateway address:'+gatewaystr);
memo1.Lines.Add('-------------------------------------------------');
work:=work^.Next ;
until (work=nil);
end;
procedure TForm1.Button2Click(Sender: TObject);
{var
Err, BufLen : DWORD;
P: Pointer;
ai :PIPAdapterInfo;
size:integer;
i,j : integer;
sip : TIpAddressString;
k:integer;
}
begin
{ k:=0;
Size := 5120;
GetMem(AI,Size);
err := GetAdaptersInfo(ai,Size);
P := ai;
//IndexStrs:=Tstringlist.Create;
if Err =NO_ERROR then
begin
while P<>nil do
with TIPAdapterInfo(P^) do
begin
// if DHCPEnabled = 1 then
inc(k);
memo1.Lines.Add(inttostr(index));
//IndexStrs.Add(inttostr(index));
// gatewaystr:=ai^.GatewayList.IPAddress;
//
// memo1.Lines.Add('gateway address:'+gatewaystr);
//------------------------------------------------------
//------------------------------------------------------------------
j:=0;
for i:= 0 to 39 do
begin
if ai^.GatewayList.IPAddress[i]<>#0 then
begin
sip[j]:= ai^.GatewayList.IPAddress[i];
inc(j);
end;
sip[j]:=#0;
gatewaystr:=String(sip);
end;
memo1.Lines.Add('gateway address:'+inttostr(k)+' '+gatewaystr);
//------------------------------------------------------
P := Next; // TIP_ADAPTER_INFO(P^).Next
end // with
end // while
else
showmessage(SysErrorMessage( Error ) );
Dispose(ai );
}
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
memo1.Lines.Clear;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -