vc 不重启改ip

//--------要是不重启就能更改外网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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值