说明如何更新动态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(