vc 不重启改ip

来源:互联网 发布:广东环保网络问政平台 编辑:程序博客网 时间:2024/06/03 22:56
//--------要是不重启就能更改外网ip那就爽歪歪了#include "stdafx.h"#include <windows.h>#include <string>#include <iostream>#include <Winsock2.h>#pragma comment(lib,"Ws2_32.lib")using namespace std;void GetLanAdapterName( char* szLanAdapterName );BOOL RegIP( LPCTSTR lpszAdapterName, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate,  LPCTSTR pDNSServer1,  LPCTSTR pDNSServer2 );BOOL NotifyIPChange( LPCTSTR lpszAdapterName, int nIndex, LPCTSTR pIPAddress, LPCTSTR pNetMask );int main(){   char AdapterName[ MAX_PATH ] ="";   GetLanAdapterName( AdapterName );   RegIP( AdapterName, "192.168.1.109","255.255.255.0", "192.168.1.1", "202.103.224.68", "202.103.225.68" );      NotifyIPChange( AdapterName, 0, "192.168.1.109",  "192.168.1.1" );      return 0;}//读取注册表取得适配器名称 void GetLanAdapterName(char* szLanAdapterName){       HKEY hKey, hSubKey, hNdiIntKey;    if( ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &hKey ) != ERROR_SUCCESS )        return;    DWORD dwIndex = 0;    DWORD dwBufSize = 256;    DWORD dwDataType;    char szSubKey[256];    unsigned char szData[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 ) // 判断是不是以太网卡                {                               dwBufSize = 256;                        if( ::RegQueryValueEx( hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize ) == ERROR_SUCCESS )                        {                         // szData 中便是适配器详细描述                      dwBufSize = 256;                            if( ::RegQueryValueEx( hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize ) == ERROR_SUCCESS )                      {                          //szData中便是适配器名称                          strcpy( szLanAdapterName, (const char *)szData );                        break;                            }                        }                    }                }                ::RegCloseKey( hNdiIntKey );            }           ::RegCloseKey(hSubKey);        }        dwBufSize = 256;    }   /* end of while */          ::RegCloseKey(hKey);}BOOL RegIP( LPCTSTR lpszAdapterName, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate,  LPCTSTR pDNSServer1,  LPCTSTR pDNSServer2 ){   HKEY hKey;   string strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";   strKeyName += lpszAdapterName;   if( ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, strKeyName.c_str(), 0, KEY_WRITE, &hKey ) != ERROR_SUCCESS )      return FALSE;   string DNSServer = pDNSServer1;   DNSServer += ",";   DNSServer += pDNSServer2;   char mszIPAddress[ 100 ];   char mszNetMask[ 100 ];   char mszNetGate[ 100 ];   char mszDNSServer[ 100 ];         strncpy( mszIPAddress, pIPAddress, 98 );   strncpy( mszNetMask, pNetMask, 98 );   strncpy( mszNetGate, pNetGate, 98 );   strncpy( mszDNSServer, DNSServer.c_str(), 98 );   int nIP, nMask, nGate, nDNSServer;   nIP = strlen( mszIPAddress );   nMask = strlen( mszNetMask );   nGate = strlen( mszNetGate );   nDNSServer = strlen( mszDNSServer );   *( mszIPAddress + nIP + 1 ) = 0x00; // REG_MULTI_SZ数据需要在后面再加个0   nIP += 2;   *( mszNetMask + nMask + 1 ) = 0x00;   nMask += 2;   *( mszNetGate + nGate + 1 ) = 0x00;   nGate += 2;   *( mszDNSServer + nDNSServer + 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 );   ::RegSetValueEx( hKey, "NameServer", 0, REG_SZ, (unsigned char*)mszDNSServer, nDNSServer );   ::RegCloseKey(hKey);   return TRUE;}//未公开函数DhcpNotifyConfigChange位于 dhcpcsvc.dll中. //原型声明typedef BOOL ( CALLBACK* DHCPNOTIFYPROC) (      LPWSTR lpwszServerName,      // 本地机器为NULL      LPWSTR lpwszAdapterName,   // 适配器名称      BOOL bNewIpAddress,         // TRUE表示更改IP      DWORD dwIpIndex,         // 指明第几个IP地址,如果只有该接口只有一个IP地址则为0      DWORD dwIpAddress,         // IP地址      DWORD dwSubNetMask,         // 子网掩码      int nDhcpAction            // 对DHCP的操作 0:不修改, 1:启用 DHCP,2:禁用 DHCP); BOOL NotifyIPChange( LPCTSTR lpszAdapterName, int nIndex, LPCTSTR pIPAddress, LPCTSTR pNetMask ){   BOOL bResult = FALSE;   HINSTANCE hDhcpDll;   DHCPNOTIFYPROC pDhcpNotifyProc;   WCHAR wcAdapterName[256];   MultiByteToWideChar( CP_ACP, 0, lpszAdapterName, -1, wcAdapterName,256 );   if( ( hDhcpDll = ::LoadLibrary("dhcpcsvc.dll") ) == NULL )      return FALSE;   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);   return bResult;}

0 0
原创粉丝点击