vcレジストリがネットワーク設定を変更するとすぐに有効になります

2083 ワード

Ip、サブネットマスク、デフォルトゲートウェイ、優先DNSサーバに関する情報はレジストリの中にあり、レジストリの値を変更してから、アプリケーションに通知すればよい.コードは以下の通りである.
未テスト
BOOL   SetIP(LPCTSTR   lpszAdapterName,   int   nIndex,   LPCTSTR   pIPAddress,   LPCTSTR   pNetMask,   LPCTSTR   pNetGate) 
{ 
	HKEY   hKey; 
	CString   strKeyName   =   "SYSTEM//CurrentControlSet//Services//Tcpip//Parameters//Interfaces// "; 
	strKeyName   +=   lpszAdapterName; 
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
		strKeyName, 
		0, 
		KEY_WRITE, 
		&hKey)   !=   ERROR_SUCCESS) 
		return   FALSE; 

	char   mszIPAddress[100]; 
	char   mszNetMask[100]; 
	char   mszNetGate[100]; 

	strncpy(mszIPAddress,   pIPAddress,   98); 
	strncpy(mszNetMask,   pNetMask,   98); 
	strncpy(mszNetGate,   pNetGate,   98); 

	int   nIP,   nMask,   nGate; 

	nIP   =   strlen(mszIPAddress); 
	nMask   =   strlen(mszNetMask); 
	nGate   =   strlen(mszNetGate); 

	*(mszIPAddress   +   nIP   +   1)   =   0x00; 
	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); 

	// IP  
	BOOL bResult   =   FALSE; 
	HINSTANCE hDhcpDll; 
	DHCPNOTIFYPROC pDhcpNotifyProc; 
	WCHAR   wcAdapterName[256]; 

	MultiByteToWideChar(CP_ACP,   0,   lpszAdapterName,   -1,   wcAdapterName,256); 

	if((hDhcpDll   =   LoadLibrary( "dhcpcsvc "))   ==   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   TRUE; 
}