9908006 发表于 2010-11-25 22:45:55

vc 不重启改ip

看雪上某人发表的,貌似其它都可以改,就是dns有些问题,研究后发现,原来是类型有问题,改了后正常运行了

//VC-ConsoleWithApi
#include <windows.h>
#include <string>

#include <iostream>
#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, "172.20.10.252","255.255.255.0", "172.20.10.1", "211.136.17.107", "211.136.18.171" );
   
   NotifyIPChange( AdapterName, 0, "172.20.10.252","172.20.10.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;
    unsigned char szData;
    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;

   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;
}

阿杰 发表于 2010-11-26 15:06:25

这代码不错,非常实用。

qwert502 发表于 2012-3-16 14:35:30

代码不错,谢谢提供

wangmin1944 发表于 2014-1-16 13:27:39

upring 发表于 2015-4-12 23:34:44

真不错 感谢楼主分享
页: [1]
查看完整版本: vc 不重启改ip