Win7下不重启修改IP地址及重启网卡方法
"本文主要介绍如何在Windows 7环境下使用VC++编程来修改本机的IP地址,并着重解决了在win7系统下重启网卡的问题。通过调用Windows API函数获取和设置网络适配器的信息,实现IP地址的动态更改,同时讨论了在调用某些函数时遇到的错误及解决方案。" 在Windows操作系统中,有时需要在不重启电脑的情况下改变计算机的IP地址。在VC++环境中,我们可以利用Windows API函数来实现这一目标。在描述中提到的代码片段中,首先包含了必要的头文件,如`#pragma comment(lib,"Iphlpapi.lib")`引入了`Iphlpapi.lib`库,这是处理网络接口信息所必需的。 `GetAdaptersInfo`函数是关键,用于获取系统中所有网络适配器的信息,包括IP地址、描述和适配器名称等。当调用该函数时,如果返回值是`ERROR_BUFFER_OVERFLOW`,说明提供的缓冲区大小不够,需要重新分配更大的空间。代码中通过判断并重新分配内存来解决这个问题。 在遍历`IP_ADAPTER_INFO`结构体链表的过程中,我们检查每个适配器的类型(`MIB_IF_TYPE_ETHERNET`表示以太网适配器),并获取其描述、适配器名称、DHCP启用状态以及IP地址。如果找到一个非默认的IP地址(即不等于`0.0.0.0`),则认为找到了要修改的适配器名称。 接下来,描述中提到了在win7下尝试使用`pDhcpNotifyProc`函数来重启网卡,但遇到了返回50错误值的问题。错误50通常代表“权限被拒绝”,这可能是因为在Win7中使用此函数的方式不正确或者需要更高的权限。为了解决这个问题,代码作者选择重新编写代码来实现网卡的重启。 在VC++中重启网卡可以使用其他API函数,如`SendARP`或`CreateFile`结合`DeviceIoControl`来实现。`SendARP`可以发送ARP请求来更新网络上的IP地址缓存,而`DeviceIoControl`则可以控制设备操作,如启动或停止网卡。不过,这部分具体的实现细节在给出的代码片段中并未显示。 总结来说,这个过程涉及到了以下几个知识点: 1. 使用VC++调用Windows API进行网络配置。 2. `GetAdaptersInfo`函数的使用,获取网络适配器信息。 3. 遍历`IP_ADAPTER_INFO`结构体来筛选出目标适配器。 4. 解决在win7下重启网卡的权限问题,可能需要重新编写代码或使用其他API函数。 5. Windows API中的错误处理,如识别和处理`ERROR_BUFFER_OVERFLOW`和`ERROR_SUCCESS`。 6. 对于特定环境(如win7)下的适配性问题和解决方案。 在实际编程中,确保对这些API函数的正确理解和使用至关重要,同时要注意不同操作系统版本间的差异,以便编写兼容性良好的代码。
//修改IP地址
用到的头文件有#pragma comment(lib, "Iphlpapi.lib") #include <cfgmgr32.h>
UINT DhcpEnabled;
CString str,na,IP,AdapterName;
LPCTSTR lpszAdapterName;
//ULONG ulAdapterInfoSize = 9000;
ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
{
delete pAdapterInfo;
pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
pAdapterInfoBkp = pAdapterInfo;
}
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
{
do{ // 遍历所有适配器
if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) // 判断是否为以太网接口
{
CString des = pAdapterInfo->Description;// 是适配器描述
na = pAdapterInfo->AdapterName ;//是适配器名称
lpszAdapterName = LPCTSTR(na);
DhcpEnabled = pAdapterInfo->DhcpEnabled;//DHCP是否开启
IP = pAdapterInfo->IpAddressList.IpAddress.String;
if(IP != "0.0.0.0")
AdapterName = na;
}
pAdapterInfo = pAdapterInfo->Next;
}
delete pAdapterInfoBkp;
//BOOL RegSetIP(LPCTSTR lpszAdapterName, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate)
//{
CString pIPAddress="192.168.0.99";//IP地址
CString pNetMask="255.255.255.0";//子网掩码
CString pNetGate = "192.168.1.1";//网关
HKEY hKey;
//char * strKeyName1;`
LPSTR strKeyName1;
CString strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";//注意写路劲时是反斜杠,不是斜杠
strKeyName += na;
strKeyName1 = (LPSTR)(LPCSTR)strKeyName;
long re = RegOpenKeyEx(HKEY_LOCAL_MACHINE, LPCTSTR(strKeyName), 0, KEY_WRITE, &hKey);
if(re != ERROR_SUCCESS)
return;
char mszIPAddress[100];
char mszNetMask[100];
char mszNetGate[100];
strncpy_s(mszIPAddress, pIPAddress, 98);
strncpy_s(mszNetMask, pNetMask, 98);
strncpy_s(mszNetGate, pNetGate, 98);
int nIP, nMask, nGate;
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展