vc源程序不重起Windows直接更改IP地址的三种方法Word格式.docx
- 文档编号:20020165
- 上传时间:2023-01-15
- 格式:DOCX
- 页数:24
- 大小:28.68KB
vc源程序不重起Windows直接更改IP地址的三种方法Word格式.docx
《vc源程序不重起Windows直接更改IP地址的三种方法Word格式.docx》由会员分享,可在线阅读,更多相关《vc源程序不重起Windows直接更改IP地址的三种方法Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
ERROR_SUCCESS)
do{//遍历所有适配器
if(pAdapterInfo->
Type==MIB_IF_TYPE_ETHERNET)//判断是否为以太网接口
//pAdapterInfo->
Description是适配器描述
AdapterName是适配器名称
pAdapterInfo=pAdapterInfo->
Next;
}while(pAdapterInfo);
deletepAdapterInfoBkp;
1.2读取注册表取得适配器名称
在Windows2000中可以通过遍历HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000n\(n是从0开始编号的数字)所有接口,在WindowsNT中可以读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkCards中的信息,下面以Windows2000为例:
HKEYhKey,hSubKey,hNdiIntKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"
System\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}"
0,
KEY_READ,
&
hKey)!
=ERROR_SUCCESS)
returnFALSE;
DWORDdwIndex=0;
DWORDdwBufSize=256;
DWORDdwDataType;
charszSubKey[256];
unsignedcharszData[256];
while(RegEnumKeyEx(hKey,dwIndex++,szSubKey,&
dwBufSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
if(RegOpenKeyEx(hKey,szSubKey,0,KEY_READ,&
hSubKey)==ERROR_SUCCESS)
if(RegOpenKeyEx(hSubKey,"
Ndi\\Interfaces"
0,KEY_READ,&
hNdiIntKey)==ERROR_SUCCESS)
dwBufSize=256;
if(RegQueryValueEx(hNdiIntKey,"
LowerRange"
0,&
dwDataType,szData,&
dwBufSize)==ERROR_SUCCESS)
if(strcmp((char*)szData,"
ethernet"
)==0)//判断是不是以太网卡
if(RegQueryValueEx(hSubKey,"
DriverDesc"
//szData中便是适配器详细描述
NetCfgInstanceID"
//szData中便是适配器名称
RegCloseKey(hNdiIntKey);
RegCloseKey(hSubKey);
}dwBufSize=256;
}/*endofwhile*/RegCloseKey(hKey);
2、将IP信息写入注册表
代码如下:
BOOLRegSetIP(LPCTSTRlpszAdapterName,LPCTSTRpIPAddress,LPCTSTRpNetMask,LPCTSTRpNetGate)
HKEYhKey;
stringstrKeyName="
SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"
;
strKeyName+=lpszAdapterName;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
strKeyName.c_str(),
KEY_WRITE,
charmszIPAddress[100];
charmszNetMask[100];
charmszNetGate[100];
strncpy(mszIPAddress,pIPAddress,98);
strncpy(mszNetMask,pNetMask,98);
strncpy(mszNetGate,pNetGate,98);
intnIP,nMask,nGate;
nIP=strlen(mszIPAddress);
nMask=strlen(mszNetMask);
nGate=strlen(mszNetGate);
*(mszIPAddress+nIP+1)=0x00;
//REG_MULTI_SZ数据需要在后面再加个0
nIP+=2;
*(mszNetMask+nMask+1)=0x00;
nMask+=2;
*(mszNetGate+nGate+1)=0x00;
nGate+=2;
RegSetValueEx(hKey,"
IPAddress"
0,REG_MULTI_SZ,(unsignedchar*)mszIPAddress,nIP);
RegSetValueEx(hKey,"
SubnetMask"
0,REG_MULTI_SZ,(unsignedchar*)mszNetMask,nMask);
DefaultGateway"
0,REG_MULTI_SZ,(unsignedchar*)mszNetGate,nGate);
RegCloseKey(hKey);
returnTRUE;
3、调用DhcpNotifyConfigChange通知配置的改变
未公开函数DhcpNotifyConfigChange位于dhcpcsvc.dll中,原型如下:
BOOLDhcpNotifyConfigChange(
LPWSTRlpwszServerName,//本地机器为NULL
LPWSTRlpwszAdapterName,//适配器名称
BOOLbNewIpAddress,//TRUE表示更改IP
DWORDdwIpIndex,//指明第几个IP地址,如果只有该接口只有一个IP地址则为0
DWORDdwIpAddress,//IP地址
DWORDdwSubNetMask,//子网掩码
intnDhcpAction);
//对DHCP的操作0:
不修改,1:
启用DHCP,2:
禁用DHCP
具体调用代码如下:
BOOLNotifyIPChange(LPCTSTRlpszAdapterName,intnIndex,LPCTSTRpIPAddress,LPCTSTRpNetMask)
BOOLbResult=FALSE;
HINSTANCEhDhcpDll;
DHCPNOTIFYPROCpDhcpNotifyProc;
WCHARwcAdapterName[256];
MultiByteToWideChar(CP_ACP,0,lpszAdapterName,-1,wcAdapterName,256);
if((hDhcpDll=LoadLibrary("
dhcpcsvc"
))==NULL)
if((pDhcpNotifyProc=(DHCPNOTIFYPROC)GetProcAddress(hDhcpDll,"
DhcpNotifyConfigChange"
))!
=NULL)
if((pDhcpNotifyProc)(NULL,wcAdapterName,TRUE,nIndex,inet_addr(pIPAddress),inet_addr(pNetMask),0)==ERROR_SUCCESS)
bResult=TRUE;
FreeLibrary(hDhcpDll);
returnbResult;
二、修改注册表:
网卡重启
更改Windows网卡属性选项中IP地址,通过对比前后注册表,可以发现以下几处发生变化
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
\Tcpip\Parameters\Interfaces\{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}]
NameServer"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}\Parameters\Tcpip]
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}]
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}\Parameters\Tcpip]
其中{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}是网卡名称(AdapterName),不同的网卡,不同的接入位置,不同的接入的时间,对应的值都不一样,它的值是第一次接入系统时,由系统生成的GUID值。
此处CurrentControlSet实际是ControlSet001的别名。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
Tcpip\Parameters\Interfaces\{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}]
是主要的设置处。
对一些服务有影响,如不设置,用netstat可以看到原来的IP地址仍处于监听状态(?
)。
但为了使设置生效,还有很重要的一步,即重启网卡。
更改网卡的配置,一般而言需要重启网卡,如Linux系统,只需运行
#ifconfigeth0down
#ifconfigeht0up
就可以实现网卡的重启。
Windows环境下的步骤与之类似:
先禁用本地连接(网卡),再启用本地连接(网卡)。
但没有相应的命令或者直接的API。
所幸的是DDK提供一套设备安装函数,用于控制系统设备,包括控制设备的状态改变。
(点击查看详细代码附件)
总结:
通过网卡重启更改IP的方法有两个步骤:
修改注册表,重启网卡。
重启网卡的全过程上面已作描述。
注册表修改的内容为文中列出四个主要项,如{97EFDAD8-EB2D-4F40-9B07-0FCD706FCB6D}的网卡名称即是内部设备名,在adapter结构中已给出。
整个注册表修改的过程比较简单,本文不加叙述。
三、使用“iphlpapi”一卡多IP
除以上两个方法外,笔者再介绍一种方法。
无论是在Windows下还是在Linux下,一块网卡都可同时具有多个IP地址。
根据TCP/IP原理,在网络层标识通信节点是IP地址,在链路层上的则是MAC地址。
只要通过ARP,将多个IP与一个MAC对应起来,就可实现一网卡多IP(其实是一MAC多IP)。
系统本身也有相应的设置选项,如windows是通过TCP/IP属性的高级选项添加的,Linux下可由ifconfig命令添加。
iphlpapi提供AddIPAddress和DelIPAddress。
如果能先加入新的IP,再去除原来的IP,即可实现IP地址的更改。
不重起Windows直接更改IP地址
作者:
浙江省温岭电信局王骏
注:
本文适用于WINDOWSNT/2000/XP/2003
下载本文示例工程
源代码运行效果图如下:
笔者通过跟踪explorer.exe中API的调用发现在netcfgx.dll中调用了dhcpcsvc.dll中一个未公开的API:
DhcpNotifyConfigChange,现将不重新启动WINDOWS直接更改IP地址的详细方法介绍如下:
一、获取适配器名称
1.1调用IPhelperAPI取得适配器名称
ULONGulAdapterInfoSize=sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO*pAdapterInfoBkp,*pAdapterInfo=(IP_ADAPTER_INFO*)newchar[ulAdapterInfoSize];
ulAdapterInfoSize)==ERROR_BUFFER_OVERFLOW)//缓冲区不够大
deletepAdapterInfo;
pAdapterInfo=(IP_ADAPTER_INFO*)newchar[ulAdapterInfoSize];
pAdapterInfoBkp=pAdapterInfo;
ulAdapterInfoSize)==ERROR_SUCCESS)
do{//遍历所有适配器
if(pAdapterInfo->
{
//pAdapterInfo->
}
pAdapterInfo=pAdapterInfo->
}while(pAdapterInfo);
在Windows2000中可以通过遍历HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000n\(n是从0开始编号的数字)所有接口,在WindowsNT中可以读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\NetworkCards中的信息,下面以Windows2000为例:
"
0,
KEY_READ,
&
returnFALSE;
DWORDdwIndex=0;
while(RegEnumKeyEx(hKey,dwIndex++,szSubKey,&
if(RegOpenKeyEx(hKey,szSubKey,0,KEY_READ,&
{
if(RegOpenKeyEx(hSubKey,"
dwBufSize=256;
if(RegQueryValueEx(hNdiIntKey,"
{
if(strcmp((char*)szData,"
)==0)//判断是不是以太网卡
{
dwBufSize=256;
if(RegQueryValueEx(hSubKey,"
{
//szData中便是适配器详细描述
dwBufSize=256;
if(RegQueryValueEx(hSubKey,"
{
//szData中便是适配器名称
}
}
}
}
RegCloseKey(hNdiIntKey);
RegCloseKey(hSubKey);
}
dwBufSize=256;
}/*endofwhile*/
RegCloseKey(hKey);
二、将IP信息写入注册表
HKEYhKey;
stringstrKeyName="
strKeyName+=lpszAdapterName;
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc 源程序 不重起 Windows 直接 更改 IP 地址 方法