C++修改IP的方法
真是人在屋檐下,不得不低头,本来还想把扒来的代码改下的,结果死活运行失败,看来用微软的东西就得原样照抄才行哎。
包含的库文件#include "Iphlpapi.h"
添加Iphlpapi.lib 通常在PSDK目录里面
定义函数 必须的 其他方式使用该代码没反应
typedef bool (WINAPI *DHCPNOTIFYCONFIGCHANGE)(LPWSTR, LPWSTR, BOOL, DWORD, DWORD, DWORD, int);
bool MyNotifyIPChange(LPCTSTR lpszAdapterName,LPCTSTR pIPAddress,LPCTSTR NetMask)
{
bool bResult;
HINSTANCE hDhcpDll;
DHCPNOTIFYCONFIGCHANGE DhcpNotifyConfigChange;
WideString s;
s=WideString(lpszAdapterName);
if((hDhcpDll = LoadLibrary("dhcpcsvc.dll")) == NULL)
return FALSE;
if((DhcpNotifyConfigChange = (DHCPNOTIFYCONFIGCHANGE)GetProcAddress(hDhcpDll,
"DhcpNotifyConfigChange")) != NULL)
{
if((DhcpNotifyConfigChange)(NULL,s.c_bstr(), TRUE, 0,
inet_addr(pIPAddress), inet_addr(NetMask), 0) == ERROR_SUCCESS)
{ bResult = TRUE; }
}
FreeLibrary(hDhcpDll);
return bResult;
}
找到网卡的名称,可以在注册表中找到,也可以使用下面代码
ULONG nLen =0;
GetAdaptersInfo(NULL,&nLen);
if(nLen){
PIP_ADAPTER_INFO pAdapterInfo =reinterpret_cast
if(GetAdaptersInfo(pAdapterInfo,&nLen)==ERROR_SUCCESS)
{
do{ // 遍历所有适配器
//if(pAdapterInfo->Type==MIB_IF_TYPE_ETHERNET) // 判断是否为以太网接口
// {
// pAdapterInfo->Description 是适配器描述
LB1->Items->Add(pAdapterInfo->AdapterName);// 是适配器名称
LB2->Items->Add(pAdapterInfo->Description);// 是适配器名称
// }
pAdapterInfo=pAdapterInfo->Next;
}while(pAdapterInfo);
}
delete pAdapterInfo;
}
写入注册表
String strKeyName="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
strKeyName+=myAdapterName;
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName.c_str(),0,KEY_WRITE,&hKey)==ERROR_SUCCESS)
{
char mszIPAddress[100];
char mszNetMask[100];
char mszNetGate[100];
strncpy(mszIPAddress,E1->Text.c_str(),98);
strncpy(mszNetMask,E2->Text.c_str(),98);
strncpy(mszNetGate,E3->Text.c_str(),98);
int nIP,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, (unsigned char*)mszIPAddress, nIP);
RegSetValueEx(hKey, "SubnetMask", 0, REG_MULTI_SZ, (unsigned char*)mszNetMask, nMask);
RegSetValueEx(hKey, "DefaultGateway", 0, REG_MULTI_SZ, (unsigned char*)mszNetGate, nGate);
RegCloseKey(hKey);
}
改动生效
MyNotifyIPChange((LPCTSTR)myAdapterName.c_str(),
(LPCTSTR)E1->Text.c_str(),(LPCTSTR)E2->Text.c_str());
结束!