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