取得IP设置方式 在网卡设置IP有两种方式,一种是自动获取,一种是设置为固定的。怎么判断本机的IP是自动获取IP的,还是设置固定的。望有人能赐教一下,给出函数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 二、原理 IP Helper 是一套用于管理本地网络设置的API(应用程序编程接口),这些API函数在iphlpapi.dll库文件中被定义。iphlpapi.dll库文件存在于Windows NT4/2000\System32 目录下或Windows 98/Me 的 \System目录。就象在VC中编写头文件一样,在delphi中使用这些API需要进行相应的定义和声明。一台计算机可能安装一块以上网络适配器或存在Modem,调用GetAdaptersInfo函数可获得当前计算机网络配置信息。这个函数包含两个参数,第一个参数是用来保存适配器信息的内存缓冲的首地址,而第二个参数是这个缓冲的大小。由于我们事先不知道本地机器上有多少个网络适配器,所以也就没法知道应该分配多大的缓存,好在GetAdaptersInfo函数在缓冲的大小不够时会在第二个参数中填入应该分配的缓冲的大小,因此,就象其它一些函数一样在需要时我们可以两次调用该函数,第一次是获取缓冲区的大小,然后分配这个缓冲以后再次调用它以获得实际的网卡信息。函数定义如下:function GetAdaptersInfo( pAdapterInfo: PTIP_ADAPTER_INFO;pOutBufLen: PULONG ): DWORD;stdcall; external ''IPHLPAPI.DLL'';函数返回的当前计算机网络配置信息存在于第一个参数pAdapterInfo指向的IP_ADAPTER_INFO结构,该数据结构是以静态链表的方式组织的。PIpAdapterInfo = ^TIpAdapterInfo; TIP_ADAPTER_INFO = recordNext: PIpAdapterInfo; //链表指针域,通过它访问整个静态键表ComboIndex: DWORD; //保留未用AdapterName: //网卡名,max_adapter_name_length=256array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char; Description: //对网卡的描述max_adapter_description_length=128array [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; //是否启用了WINSPrimaryWinsServer: IP_ADDR_STRING; //主WINS地址SecondaryWinsServer: IP_ADDR_STRING; //辅WINS地址LeaseObtained: time_t; //当前DHCP租借获取的时间LeaseExpires: time_t; //当前DHCP租借失效时间end;这些数据就是网络属性→TCP/IP的属性页里的内容。使用这些信息可进行网络配置信息的更改,下面说明如何更新动态IP和修改静态网络配置信息。2.1 DhcpEnabled = 1 则说明本地IP为DHCP服务器动态分配,调用IpReleaseAddress和IpRenewAddress可释放、重新获得系统IP地址。函数定义如下:function IpRenewAddress(var AdapterInfo: TIP_ADAPTER_INDEX_MAP): DWORD;stdcall; external ''IPHLPAPI.DLL'';function IpReleaseAddress(var AdapterInfo: TIP_ADAPTER_INDEX_MAP): DWORD;stdcall;external ''IPHLPAPI.DLL'';使用这两个函数必需获取网络接口信息,以指定释放、更新IP地址的适配器索引号。一个网络接口是网卡的逻辑抽象,它们是一对一的关系。注意调用GetNumberOfInterfaces函数返回本机接口的数量,实际上比网络接口数目多一个,因为每个系统都附加有一个调试用的网络接口,这个接口的IP地址是127.0.0.1子网掩码是255.0.0.0。GetInterfaceInfo函数提取网络接口的信息: function GetInterfaceInfo(pIfTable: PTIP_INTERFACE_INFO;dwOutBufLen: PULONG): DWORD;stdcall; external ''IPHLPAPI.DLL'';它返回IP_INTERFACE_INFO结构中有一个NumAdapters整型的数据域记录了当前本机适配器数量,Adapter为IP_ADAPTER_INDEX_MAP结构的数据数组。PIP_INTERFACE_INFO = ^TIP_INTERFACE_INFO; TIP_INTERFACE_INFO = recordNumAdapters : Longint; Adapter : array [0..1-1] of IP_ADAPTER_INDEX_MAP; end;其中的IP_ADAPTER_INDEX_MAP结构如下:PIpAdapterIndexMap = ^TIpAdapterIndexMap; TIP_ADAPTER_INDEX_MAP = recordIndex: ULONG; Name: array [0..127] of WCHAR; end;当此结构中Index值等于通过调用GetAdaptersInfo函数pAdapterInfo指向的结构中Index域的值,说明网络适配器和网络接口相匹配,就可调用IpReleaseAddress和IpRenewAddress进行释放、重新获得该适配器IP地址。2.2 在Delphi中通过直接使用Netsh.exe实用程序可改变windows2000/XP系统的IP网络配置信息。三、程序实现 3.1 在WIN98中运行Winipcfg实用程序, 在windows2000/XP中运行Ipconfig可释放、重新获得系统(所有)IP地址。下面用Delphi编程实现:首先声明Public IndexStrs : Tstrings; //保存本机所有网卡索引号procedure TForm1.Button1Click(Sender: TObject);varErr, BufLen : DWORD;P : Pointer;AdapterInfo : PTIP_ADAPTER_INFO;beginBufLen := SizeOf( AdapterInfo^ );New( AdapterInfo );Err := GetAdaptersInfo( AdapterInfo, @BufLen );P := AdapterInfo;IndexStrs:=Tstringlist.Create;if Err =NO_ERROR thenbeginwhile P <> nil dowith TIP_ADAPTER_INFO(P^) dobeginif DHCPEnabled = 1 thenIndexStrs.Add(inttostr(index));P := Next; // TIP_ADAPTER_INFO(P^).Next end // withend // whileelseshowmessage( SysErrorMessage( Error ) );Dispose( AdapterInfo );end;Button1的Click事件:当本地IP为DHCP服务器动态分配时把本地机器所有网卡索引号存于TStrings类型IndexStrs中。procedure TForm1.Button2Click(Sender: TObject);varRes, Err,Suc,BufSize : DWORD;ip_map: TIP_ADAPTER_INDEX_MAP;cnt,dwIndex,i :Longint;InterfaceInfo:PTIP_INTERFACE_INFO;beginBufSize :=sizeof(Interfaceinfo^);Interfaceinfo := AllocMem(BufSize);Err:= Getinterfaceinfo(Interfaceinfo,@BufSize);if Err = ERROR_INSUFFICIENT_BUFFER thenbeginFreemem(Interfaceinfo);Interfaceinfo := Allocmem(Bufsize);tryRes := GetInterfaceInfo(InterfaceInfo, @BufSize);if Res = NO_ERROR thenbeginfor i:=0 to IndexStrs.Count-1 dobegindwindex:=StrToInt(IndexStrs[i]);for Cnt := 0 to InterfaceInfo^.NumAdapters - 1 doif InterFaceInfo^.Adapter[cnt].index = dwIndex thenSuc := IpReleaseAddress(InterFaceInfo^.Adapter[cnt]);if Suc = NO_ERROR then showmessage('' 释放IP成功! '');end; // for i:=0 to...释放所有IPfor i:=0 to IndexStrs.Count-1 dobegindwindex:=StrToInt(IndexStrs[i]);for Cnt := 0 to InterfaceInfo^.NumAdapters - 1 doif InterFaceInfo^.Adapter[cnt].index = dwIndex thenSuc := IpReNewAddress(InterFaceInfo^.Adapter[cnt]);if Suc = NO_ERROR then showmessage('' 重新获得IP成功! '');end; // for i:=0 to...重新获得所有IPend;finallyFreeMem(InterFaceInfo);end;end;IndexStrs.Free;end;Button2的Click事件:用IndexStrs中的值匹配网络接口信息中Index,找到相应的适配器释放IP地址,通过循环释放、重新获得所有IP地址。3.2 在Delphi中使用Netsh 实用程序改变网络配置。在Windows2000以后的操作系统中都提供了Netsh.exe实用程序。Netsh 是一种命令行实用程序,一般从命令提示符启动 netsh 并更改到包含要使用的命令的上下文,可用来显示或修改当前正在运行的计算机的网络配置,下面说明在Delphi中使用它改变网络配置。procedure TForm1.Button3Click(Sender: TObject);beginShellExecute(Handle, ''open'', ''netsh'', PChar(''interface ip set address "本地连接" static 192.168.0.10 255.255.255.0 192.168.0.1 1''), nil, SW_HIDE);end;无论当前系统IP地址是动态还是静态,Button3Click事件把当前网络配置改为静态IP地址192168.0.10,子网掩码255.255.255.0,网关:192.168.0.1,跃点数:1;同样执行ShellExecute(Handle, ''open'', ''netsh'', PChar(''interface ip set address "本地连接" dhcp''), nil, SW_HIDE)把本地IP地址改为动态。netsh功能强大,通过此种形式可修改、删除、增加DNS、WINS、gateway等网络配置信息,而且更改的信息直接生效,不需要“禁用”→“启用” 网卡或重新启动windows。四、结束语 实际上通过修改系统注册表也可改变系统的IP地址等网络配置。不同版本操作系统网络配置信息在注册表中的位置不同。针对win95、win98系统的静态IP地址通过修改注册表来改变IP配置信息,不过所有通过修改系统注册表项改变的IP配置信息需经过 “禁用”→“启用” 网卡或重新启动windows才能生效。另外值得注意的是IP Help API针对win95无效。 真不知道如何通过如何得知了。从调用windows设置入手,找到设置网络连接的,根据里面寻址方式判断。以上仅仅思路,具体如何实现,网上找找 里面说明了: DhcpEnabled = 1 则说明本地IP为DHCP服务器动态分配取得结构信息后,判断这个成员 iphlpapi当中有GetAdaptersInfoIP_ADAPTER_INFO结构的DhcpEnabled即是. unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock, ScktComp, CheckLst;const MAX_ADAPTER_NAME_LENGTH = 256; MAX_ADAPTER_DESCRIPTION_LENGTH = 128; MAX_ADAPTER_ADDRESS_LENGTH = 8;type TIP_ADDRESS_STRING = record IPstring: array [0..15] of Char; end; PIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING; TIP_MASK_STRING = TIP_ADDRESS_STRING; PIP_MASK_STRING = ^TIP_MASK_STRING; PIP_ADDR_STRING = ^TIP_ADDR_STRING; TIP_ADDR_STRING = record Next: PIP_ADDR_STRING; IpAddress: TIP_ADDRESS_STRING; IpMask: TIP_MASK_STRING; Context:DWORD; end; PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO; TIP_ADAPTER_INFO = packed record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 4-1] of Char; Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 4-1] of Char; AddressLength: UINT; Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of BYTE; Index: DWORD; dwType: UINT; DhcpEnabled: UINT; CurrentIpAddress: PIP_ADDR_STRING; IpAddressList: TIP_ADDR_STRING; GatewayList: TIP_ADDR_STRING; DhcpServer: TIP_ADDR_STRING; HaveWins: BOOL; PrimaryWinsServer: TIP_ADDR_STRING; SecondaryWinsServer: TIP_ADDR_STRING; end; TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationfunction GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; pOutBufLen: PDWORD): DWORD; stdcall; external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var pbuf:PIP_ADAPTER_INFO; buflen:DWORD; i: integer;begin buflen:= 0; if GetAdaptersInfo(pbuf, @bufLen) = ERROR_BUFFER_OVERFLOW then begin pbuf:= AllocMem(buflen); if GetAdaptersInfo(pbuf, @bufLen) = ERROR_SUCCESS then while pbuf <> nil do begin showmessage( IntToStr( pbuf.DhcpEnabled ) );//1动态分配 pbuf := pbuf.Next; end; FreeMem(pbuf); end;end;end. 调用GetAdaptersInfo函数就可以实现 自动化测试cxGrid如何定位单元格 谁有winpcap for delphi请给我一份! 请数据库SQL高手帮个忙?如何在这两个表中取出符合条件的记录? Sendmessage发送Ctrl+C消息问题 两个日期相减,怎么显示相差几年几月几日? 请教一个BatchMove速度问题,其慢!----2 简单的更新记录问题???????? 象Microsoft Access那样的窗口如何实现? 关于位图的问题? 在delphi中如何打开eps文件或者说如何浏览eps文件,请大家支招!!! 关于OXC 事件问题! 请教一个有效率把顺序链表转为树状结构的算法(最终要实现在TREEVIEW里)
IP Helper 是一套用于管理本地网络设置的API(应用程序编程接口),这些API函数在iphlpapi.dll库文件中被定义。iphlpapi.dll库文件存在于Windows NT4/2000\System32 目录下或Windows 98/Me 的 \System目录。就象在VC中编写头文件一样,在delphi中使用这些API需要进行相应的定义和声明。
一台计算机可能安装一块以上网络适配器或存在Modem,调用GetAdaptersInfo函数可获得当前计算机网络配置信息。这个函数包含两个参数,第一个参数是用来保存适配器信息的内存缓冲的首地址,而第二个参数是这个缓冲的大小。由于我们事先不知道本地机器上有多少个网络适配器,所以也就没法知道应该分配多大的缓存,好在GetAdaptersInfo函数在缓冲的大小不够时会在第二个参数中填入应该分配的缓冲的大小,因此,就象其它一些函数一样在需要时我们可以两次调用该函数,第一次是获取缓冲区的大小,然后分配这个缓冲以后再次调用它以获得实际的网卡信息。函数定义如下:
function GetAdaptersInfo( pAdapterInfo: PTIP_ADAPTER_INFO;
pOutBufLen: PULONG ): DWORD;
stdcall; external ''IPHLPAPI.DLL'';
函数返回的当前计算机网络配置信息存在于第一个参数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;
这些数据就是网络属性→TCP/IP的属性页里的内容。使用这些信息可进行网络配置信息的更改,下面说明如何更新动态IP和修改静态网络配置信息。
2.1 DhcpEnabled = 1 则说明本地IP为DHCP服务器动态分配,调用IpReleaseAddress和IpRenewAddress可释放、重新获得系统IP地址。函数定义如下:
function IpRenewAddress(
var AdapterInfo: TIP_ADAPTER_INDEX_MAP): DWORD;
stdcall; external ''IPHLPAPI.DLL'';
function IpReleaseAddress(
var AdapterInfo: TIP_ADAPTER_INDEX_MAP): DWORD;
stdcall;external ''IPHLPAPI.DLL'';
使用这两个函数必需获取网络接口信息,以指定释放、更新IP地址的适配器索引号。一个网络接口是网卡的逻辑抽象,它们是一对一的关系。注意调用GetNumberOfInterfaces函数返回本机接口的数量,实际上比网络接口数目多一个,因为每个系统都附加有一个调试用的网络接口,这个接口的IP地址是127.0.0.1子网掩码是255.0.0.0。GetInterfaceInfo函数提取网络接口的信息:
function GetInterfaceInfo(pIfTable: PTIP_INTERFACE_INFO;
dwOutBufLen: PULONG): DWORD;
stdcall; external ''IPHLPAPI.DLL'';
它返回IP_INTERFACE_INFO结构中有一个NumAdapters整型的数据域记录了当前本机适配器数量,Adapter为IP_ADAPTER_INDEX_MAP结构的数据数组。
PIP_INTERFACE_INFO = ^TIP_INTERFACE_INFO;
TIP_INTERFACE_INFO = record
NumAdapters : Longint;
Adapter : array [0..1-1] of IP_ADAPTER_INDEX_MAP;
end;
其中的IP_ADAPTER_INDEX_MAP结构如下:
PIpAdapterIndexMap = ^TIpAdapterIndexMap;
TIP_ADAPTER_INDEX_MAP = record
Index: ULONG;
Name: array [0..127] of WCHAR;
end;
当此结构中Index值等于通过调用GetAdaptersInfo函数pAdapterInfo指向的结构中Index域的值,说明网络适配器和网络接口相匹配,就可调用IpReleaseAddress和IpRenewAddress进行释放、重新获得该适配器IP地址。
2.2 在Delphi中通过直接使用Netsh.exe实用程序可改变windows2000/XP系统的IP网络配置信息。三、程序实现
3.1 在WIN98中运行Winipcfg实用程序, 在windows2000/XP中运行Ipconfig可释放、重新获得系统(所有)IP地址。下面用Delphi编程实现:
首先声明Public IndexStrs : Tstrings; //保存本机所有网卡索引号
procedure TForm1.Button1Click(Sender: TObject);
var
Err, BufLen : DWORD;
P : Pointer;
AdapterInfo : PTIP_ADAPTER_INFO;
begin
BufLen := SizeOf( AdapterInfo^ );
New( AdapterInfo );
Err := GetAdaptersInfo( AdapterInfo, @BufLen );
P := AdapterInfo;
IndexStrs:=Tstringlist.Create;
if Err =NO_ERROR then
begin
while P <> nil do
with TIP_ADAPTER_INFO(P^) do
begin
if DHCPEnabled = 1 then
IndexStrs.Add(inttostr(index));
P := Next; // TIP_ADAPTER_INFO(P^).Next
end // with
end // while
else
showmessage( SysErrorMessage( Error ) );
Dispose( AdapterInfo );
end;
Button1的Click事件:当本地IP为DHCP服务器动态分配时把本地机器所有网卡索引号存于TStrings类型IndexStrs中。
procedure TForm1.Button2Click(Sender: TObject);
var
Res, Err,Suc,BufSize : DWORD;
ip_map: TIP_ADAPTER_INDEX_MAP;
cnt,dwIndex,i :Longint;
InterfaceInfo:PTIP_INTERFACE_INFO;
begin
BufSize :=sizeof(Interfaceinfo^);
Interfaceinfo := AllocMem(BufSize);
Err:= Getinterfaceinfo(Interfaceinfo,@BufSize);
if Err = ERROR_INSUFFICIENT_BUFFER then
begin
Freemem(Interfaceinfo);
Interfaceinfo := Allocmem(Bufsize);
try
Res := GetInterfaceInfo(InterfaceInfo, @BufSize);
if Res = NO_ERROR then
begin
for i:=0 to IndexStrs.Count-1 do
begin
dwindex:=StrToInt(IndexStrs[i]);
for Cnt := 0 to InterfaceInfo^.NumAdapters - 1 do
if InterFaceInfo^.Adapter[cnt].index = dwIndex then
Suc := IpReleaseAddress(InterFaceInfo^.Adapter[cnt]);
if Suc = NO_ERROR then showmessage('' 释放IP成功! '');
end; // for i:=0 to...释放所有IP
for i:=0 to IndexStrs.Count-1 do
begin
dwindex:=StrToInt(IndexStrs[i]);
for Cnt := 0 to InterfaceInfo^.NumAdapters - 1 do
if InterFaceInfo^.Adapter[cnt].index = dwIndex then
Suc := IpReNewAddress(InterFaceInfo^.Adapter[cnt]);
if Suc = NO_ERROR then showmessage('' 重新获得IP成功! '');
end; // for i:=0 to...重新获得所有IP
end;
finally
FreeMem(InterFaceInfo);
end;
end;
IndexStrs.Free;
end;
Button2的Click事件:用IndexStrs中的值匹配网络接口信息中Index,找到相应的适配器释放IP地址,通过循环释放、重新获得所有IP地址。
3.2 在Delphi中使用Netsh 实用程序改变网络配置。
在Windows2000以后的操作系统中都提供了Netsh.exe实用程序。Netsh 是一种命令行实用程序,一般从命令提示符启动 netsh 并更改到包含要使用的命令的上下文,可用来显示或修改当前正在运行的计算机的网络配置,下面说明在Delphi中使用它改变网络配置。
procedure TForm1.Button3Click(Sender: TObject);
begin
ShellExecute(Handle, ''open'', ''netsh'', PChar(''interface ip set address "本地连接" static 192.168.0.10 255.255.255.0 192.168.0.1 1''), nil, SW_HIDE);
end;
无论当前系统IP地址是动态还是静态,Button3Click事件把当前网络配置改为静态IP地址192168.0.10,子网掩码255.255.255.0,网关:192.168.0.1,跃点数:1;同样执行ShellExecute(Handle, ''open'', ''netsh'', PChar(''interface ip set address "本地连接" dhcp''), nil, SW_HIDE)把本地IP地址改为动态。netsh功能强大,通过此种形式可修改、删除、增加DNS、WINS、gateway等网络配置信息,而且更改的信息直接生效,不需要“禁用”→“启用” 网卡或重新启动windows。
四、结束语
实际上通过修改系统注册表也可改变系统的IP地址等网络配置。不同版本操作系统网络配置信息在注册表中的位置不同。针对win95、win98系统的静态IP地址通过修改注册表来改变IP配置信息,不过所有通过修改系统注册表项改变的IP配置信息需经过 “禁用”→“启用” 网卡或重新启动windows才能生效。另外值得注意的是IP Help API针对win95无效。
从调用windows设置入手,找到设置网络连接的,根据里面寻址方式判断。
以上仅仅思路,具体如何实现,网上找找
取得结构信息后,判断这个成员
IP_ADAPTER_INFO结构的DhcpEnabled即是.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinSock, ScktComp, CheckLst;
const
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;type
TIP_ADDRESS_STRING = record
IPstring: array [0..15] of Char;
end;
PIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING;
TIP_MASK_STRING = TIP_ADDRESS_STRING;
PIP_MASK_STRING = ^TIP_MASK_STRING; PIP_ADDR_STRING = ^TIP_ADDR_STRING;
TIP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: TIP_ADDRESS_STRING;
IpMask: TIP_MASK_STRING;
Context:DWORD;
end; PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;
TIP_ADAPTER_INFO = packed record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 4-1] of Char;
Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 4-1] of Char;
AddressLength: UINT;
Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of BYTE;
Index: DWORD;
dwType: UINT;
DhcpEnabled: UINT;
CurrentIpAddress: PIP_ADDR_STRING;
IpAddressList: TIP_ADDR_STRING;
GatewayList: TIP_ADDR_STRING;
DhcpServer: TIP_ADDR_STRING;
HaveWins: BOOL;
PrimaryWinsServer: TIP_ADDR_STRING;
SecondaryWinsServer: TIP_ADDR_STRING;
end;
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
pOutBufLen: PDWORD): DWORD; stdcall;
external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
pbuf:PIP_ADAPTER_INFO;
buflen:DWORD;
i: integer;
begin
buflen:= 0;
if GetAdaptersInfo(pbuf, @bufLen) = ERROR_BUFFER_OVERFLOW then
begin
pbuf:= AllocMem(buflen);
if GetAdaptersInfo(pbuf, @bufLen) = ERROR_SUCCESS then
while pbuf <> nil do
begin
showmessage( IntToStr( pbuf.DhcpEnabled ) );//1动态分配
pbuf := pbuf.Next;
end;
FreeMem(pbuf);
end;
end;
end.
就可以实现