www.pudn.com > checkUnusedIP.rar > SetIPDialog.cpp


// SetIPDialog.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "CheckIP.h" 
#include "CheckIPDlg.h" 
#include "SetIPDialog.h" 
#include ".\setipdialog.h" 
#include "Iphlpapi.h" 
#pragma comment (lib,"Iphlpapi") 
 
 
// CSetIPDialog 对话框 
 
IMPLEMENT_DYNAMIC(CSetIPDialog, CDialog) 
CSetIPDialog::CSetIPDialog(CWnd* pParent /*=NULL*/) 
	: CDialog(CSetIPDialog::IDD, pParent) 
	, m_bIsButtonChecked(FALSE) 
{ 
} 
 
CSetIPDialog::~CSetIPDialog() 
{ 
} 
 
void CSetIPDialog::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	DDX_Control(pDX, IDC_IPADDRESS, m_IPAddr); 
	DDX_Control(pDX, IDC_IPMASK, m_IPMask); 
	DDX_Control(pDX, IDC_IPGATEWAY, m_IPGateWay); 
	DDX_Control(pDX, IDC_IPPRIDNS, m_IPPriDNS); 
	DDX_Control(pDX, IDC_IPSECDNS, m_IPSecDNS); 
	DDX_Control(pDX, IDC_IPTHDNS, m_IPThDNS); 
	DDX_Control(pDX, IDC_CHECK, m_ButtonCheck); 
} 
 
 
BEGIN_MESSAGE_MAP(CSetIPDialog, CDialog) 
	ON_BN_CLICKED(IDOK, OnBnClickedOk) 
	ON_BN_CLICKED(IDC_CHECK, OnBnClickedCheck) 
END_MESSAGE_MAP() 
 
 
// CSetIPDialog 消息处理程序 
 
void CSetIPDialog::OnBnClickedOk() 
{ 
	if (!UpdateData(TRUE)) { 
		return; 
	} 
	//得到用户填写的IP地址 
	m_IPAddr.GetAddress(m_dwIPAddr);   
	m_IPMask.GetAddress(m_dwIPMask);  
	m_IPGateWay.GetAddress(m_dwIPGateWay); 
	m_IPPriDNS.GetAddress(m_dwIPPriDNS); 
	m_IPSecDNS.GetAddress(m_dwIPSecDNS); 
	m_IPThDNS.GetAddress(m_dwIPThDNS); 
	OnOK(); 
} 
 
BOOL CSetIPDialog::OnInitDialog() 
{ 
 
	CDialog::OnInitDialog(); 
 
	//设置DNS控件 
	CString strValueName("NameServer"); 
	DWORD dwType=REG_SZ;  //类型 
 
	CString  strIP=RegStringQuery(strValueName,dwType); 
	if (strIP.IsEmpty()) { 
		return FALSE; 
	} 
	int curPos= 0; //分割的位置 
	int iFlag = 0;  
	CString resToken; 
	resToken= strIP.Tokenize(",",curPos); 
	while (!resToken.IsEmpty()) 
	{ 
		if (iFlag == 0) { 
			SetIPControlAddr(resToken,m_IPPriDNS); //设置首选DNS 
		} 
		else if (iFlag == 1) { 
			SetIPControlAddr(resToken,m_IPSecDNS); //设置第一个备用DNS 
		} 
		else if (iFlag == 2) { 
			SetIPControlAddr(resToken,m_IPThDNS); //设置第二个备用DNS 
		} 
		else 
		{ 
			break; 
		} 
 
		resToken= strIP.Tokenize(",",curPos); 
		iFlag++; 
	}; 
 
 
	//设置子网掩码 
	//strValueName.Empty(); 
	dwType = REG_MULTI_SZ; 
	//memset(chName,0,sizeof(chName)); 
	strValueName = "SubnetMask"; 
 
	strIP = RegStringQuery(strValueName,dwType); 
	SetIPControlAddr(strIP,m_IPMask);  //设置子网掩码 
 
	//设置网关 
	dwType = REG_MULTI_SZ; 
	strValueName = "DefaultGateway"; 
	 
	strIP = RegStringQuery(strValueName,dwType); 
	SetIPControlAddr(strIP,m_IPGateWay);  //设置网关 
 
 
	//从主对话筐中读取双击的IP地址,用来初始化IP地址 
	CString strFreeIPAddr = ((CCheckIPDlg *)AfxGetMainWnd())->m_strFreeIPAddr; 
	SetIPControlAddr(strFreeIPAddr,m_IPAddr); //设置IP地址 
	 
	////////////////////////////////////////////////////////////////////////// 
	//设置状态!! 
	m_IPPriDNS.EnableWindow(FALSE); 
	m_IPSecDNS.EnableWindow(FALSE); 
	m_IPThDNS.EnableWindow(FALSE);	 
	m_ButtonCheck.SetCheck(BST_UNCHECKED); 
 
	return true; 
} 
 
//读出用户设置的网卡的名称 
//其实在多处都使用了网卡的名称,最好是把这个名称存在一个地方就没有这么麻烦了 
CString CSetIPDialog::GetNIDName() 
{ 
	char tempChar; 
	int iNum = ((CCheckIPDlg *)AfxGetMainWnd())->m_ComBox.GetCurSel();	//获得ComboBox的选择 
	int iNumTemp=0;								//和iNum比较的数 
	ULONG uListSize=1; 
 
	PIP_ADAPTER_INFO pAdapter; // 定义PIP_ADAPTER_INFO结构存储网卡信息 
 
 
	DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar,  
 
		&uListSize); // 关键函数 
 
 
	if (dwRet == ERROR_BUFFER_OVERFLOW) 
 
	{ 
 
		PIP_ADAPTER_INFO pAdapterListBuffer =  
 
			(PIP_ADAPTER_INFO)new(char[uListSize]);//分配空间 
 
		dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize); 
 
		if (dwRet == ERROR_SUCCESS) 
 
		{ 
 
			pAdapter = pAdapterListBuffer; 
			while (pAdapter) { 
				if (iNumTemp==iNum) { 
					//返回名称 
					return pAdapter->AdapterName; 
				} 
				pAdapter = pAdapter->Next; 
				iNumTemp++; 
			} 
			delete pAdapterListBuffer; 
 
		} 
		return CString(); 
 
	}	 
	return CString(); 
} 
 
//Check 按钮的状态变化引起的DNS地址控件的状态变化 
void CSetIPDialog::OnBnClickedCheck() 
{ 
	if (m_ButtonCheck.GetCheck() == BST_CHECKED) { 
		m_IPPriDNS.EnableWindow(TRUE); 
		m_IPSecDNS.EnableWindow(TRUE); 
		m_IPThDNS.EnableWindow(TRUE); 
		m_bIsButtonChecked = TRUE; 
	} 
	else 
	{ 
		m_IPPriDNS.EnableWindow(FALSE); 
		m_IPSecDNS.EnableWindow(FALSE); 
		m_IPThDNS.EnableWindow(FALSE);	 
		m_bIsButtonChecked = FALSE; 
	} 
	 
} 
 
 
 
 
//从注册表中读出DNS 
CString CSetIPDialog::RegStringQuery(CString strValueName,DWORD dwType) 
{ 
	//从注册表中读出DNS 
	CString strNIDName = GetNIDName(); 
	if (strNIDName.IsEmpty()) 
	{ 
		AfxMessageBox(_T("读取网卡出现错误")); 
		return CString(); 
	} 
	HKEY RootKey = HKEY_LOCAL_MACHINE; 
	CString strSubKey("SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters\\Interfaces\\"); 
	strSubKey = strSubKey + strNIDName; 
	HKEY hKey; 
	DWORD dwLength; 
	CString strValue; 
	 
	memset(m_chName,0,sizeof(m_chName)); 
 
 
	if(RegOpenKeyEx(RootKey,strSubKey,0,KEY_READ,&hKey)==ERROR_SUCCESS) 
	{ 
		if(RegQueryValueEx(hKey,strValueName,NULL,&dwType,(unsigned char *)m_chName,&dwLength)!=ERROR_SUCCESS) 
		{ 
			AfxMessageBox(strValueName); 
			return CString(); 
		} 
		RegCloseKey(hKey); 
	} 
	else 
	{ 
		return CString(); 
		AfxMessageBox("错误:无法打开有关的hKEY"); 
	} 
	strValue = m_chName; 
	return strValue; 
	 
} 
 
//把得到的IP地址字符串设置到相应的IP地址控件上 
BOOL CSetIPDialog::SetIPControlAddr(CString strIP,CIPAddressCtrl &IPCtrl) 
{ 
	DWORD dwIP; 
	unsigned  char* pIP; 
 
	dwIP  =  inet_addr(strIP);   
	pIP  =  (unsigned  char*)&dwIP;   
	IPCtrl.SetAddress(*pIP,  *(pIP+1),  *(pIP+2),  *(pIP+3)); 
	return TRUE; 
}