// PasswordMng.cpp : implementation file // #include "stdafx.h" #include "PasswordMng.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPasswordMng dialog extern int g_iUILanguage; extern CGeoMativeApp theApp; extern HHOOK hHook; extern LRESULT __stdcall CBTHookProc(long nCode, WPARAM wParam, LPARAM lParam); extern BOOL GetSubStringInHeadAndTail(const CString& szSource, CString& szSub, const CString& szHead, const CString& szTail); CPasswordMng::CPasswordMng(_ConnectionPtr& pConnection,CWnd* pParent /*=NULL*/) : CDialog(CPasswordMng::IDD, pParent) { //{{AFX_DATA_INIT(CPasswordMng) m_edConfirmPass = _T(""); m_edNewPass = _T(""); m_edOldPass = _T(""); //}}AFX_DATA_INIT m_pConnection = pConnection; m_strDBGD10Paswword = _T(""); m_strDBGeoPassword = _T(""); m_mapPasswordMng.clear(); } void CPasswordMng::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPasswordMng) DDX_Control(pDX, IDC_COMBO_MACHINE_ID, m_cmbMachineID); DDX_Control(pDX, IDC_COMBO_PASS_OPER_TYPE, m_cmbOperType); DDX_Control(pDX, IDC_COMBO_MACHINE_TYPE, m_cmbMachineType); DDX_Text(pDX, IDC_EDIT_CONFIRM_PASS, m_edConfirmPass); DDV_MaxChars(pDX, m_edConfirmPass, 50); DDX_Text(pDX, IDC_EDIT_NEW_PASS, m_edNewPass); DDV_MaxChars(pDX, m_edNewPass, 50); DDX_Text(pDX, IDC_EDIT_OLD_PASS, m_edOldPass); DDV_MaxChars(pDX, m_edOldPass, 50); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPasswordMng, CDialog) //{{AFX_MSG_MAP(CPasswordMng) ON_CBN_SELCHANGE(IDC_COMBO_PASS_OPER_TYPE, OnSelchangeComboPassOperType) ON_CBN_SELCHANGE(IDC_COMBO_MACHINE_TYPE, OnSelchangeComboMachineType) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPasswordMng message handlers void CPasswordMng::OnSelchangeComboPassOperType() { // TODO: Add your control notification handler code here int nCurSel = m_cmbOperType.GetCurSel(); if (CB_ERR == nCurSel) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请正确选择操作类型!")); else MessageBoxEx(NULL, _T("Please chose operation type correctly!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } m_edOldPass.Empty(); m_edNewPass.Empty(); m_edConfirmPass.Empty(); UpdateData(FALSE); ShowPasswordInfo(nCurSel); } BOOL CPasswordMng::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_mapPasswordMng.clear(); theApp.GetPasswordPtr(m_mapPasswordMng); //get online device CPtrArray olDevList; CDevice* pDev = NULL; olDevList.RemoveAll(); theApp.m_pDevManager->GetOLDevList(&olDevList); int iIndex = (int)VAL_ZERO; m_cmbMachineID.Clear(); while (iIndex < olDevList.GetSize()) { pDev = NULL; pDev = (CDevice*)olDevList.GetAt(iIndex); if (PZ_STATE_NEW != pDev->m_uState) { m_cmbMachineID.AddString(pDev->m_szDevSN); m_cmbMachineID.SetItemDataPtr(m_cmbMachineID.GetCount() - 1, pDev); } iIndex++; } m_cmbMachineID.SetCurSel(0); //set machine type info m_cmbMachineType.Clear(); m_cmbMachineType.AddString(_T("Geomative")); m_cmbMachineType.AddString(_T("GD-20")); m_cmbMachineType.SetCurSel(0); //set operation type m_cmbOperType.Clear(); m_cmbOperType.AddString(_T("Create Password")); m_cmbOperType.AddString(_T("Modify Password")); m_cmbOperType.AddString(_T("Delete Password")); m_cmbOperType.SetCurSel(0); //disable gd10 devcie_name infomation m_cmbMachineID.EnableWindow(FALSE); UpdateData(FALSE); ShowPasswordInfo(0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //DEL void CPasswordMng::GetDBPasswordInfo() //DEL { //DEL _RecordsetPtr pRecInfo= NULL; //DEL pRecInfo.CreateInstance(_uuidof(Recordset)); //DEL m_mapPasswordMng.clear(); //DEL CString strDevName; //DEL CString strGeoName = _T("Geomative"); //DEL try //DEL { //DEL pRecInfo->Open(_T("select * from password_info"), _variant_t((IDispatch*)m_pConnection, true), //DEL adOpenStatic, adLockOptimistic, adCmdText); //DEL bool bFirstGeo = false; //DEL STDBPasswordInfo stDBPassInfo; //DEL while ((short)VAL_ZERO == pRecInfo->adoEOF) //DEL { //DEL //只获取第一个Geomative的密码 //DEL if (!bFirstGeo && (1 == pRecInfo->GetCollect(_T("DevType")).iVal) ) //DEL { //DEL stDBPassInfo.nTableID = (int)(pRecInfo->GetCollect(_T("ID")).iVal); //DEL stDBPassInfo.strPassword.Empty(); //DEL stDBPassInfo.strPassword = (CString)(LPCTSTR)(_bstr_t)pRecInfo->GetCollect(_T("Password")); //DEL bFirstGeo = true; //DEL m_mapPasswordMng.insert(std::make_pair(strGeoName,stDBPassInfo)); //DEL } //DEL //DEL //获取GD10主机的密码,如果这里存在相同的主机名,则只获取第一个主机的密码 //DEL if (2 == pRecInfo->GetCollect(_T("DevType")).iVal) //DEL { //DEL stDBPassInfo.strPassword.Empty(); //DEL strDevName.Empty(); //DEL stDBPassInfo.nTableID = (int)(pRecInfo->GetCollect(_T("ID")).iVal); //DEL strDevName = (CString)(LPCTSTR)(_bstr_t)pRecInfo->GetCollect(_T("DevName")); //DEL stDBPassInfo.strPassword = (CString)(LPCTSTR)(_bstr_t)pRecInfo->GetCollect(_T("Password")); //DEL m_mapPasswordMng.insert(std::make_pair(strDevName,stDBPassInfo)); //DEL } //DEL pRecInfo->MoveNext(); //DEL } //DEL //DEL } //DEL catch (_com_error e) //DEL { //DEL hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); //DEL AfxMessageBox(e.Description()); //DEL m_pConnection->RollbackTrans(); //DEL } //DEL pRecInfo->Close(); //DEL return; //DEL //DEL } void CPasswordMng::OnSelchangeComboMachineType() { // TODO: Add your control notification handler code here int nCurSel = m_cmbMachineType.GetCurSel()+1; if (enGeomativeType == nCurSel) { m_cmbMachineID.EnableWindow(FALSE); } else if (enGD10Type == nCurSel) { m_cmbMachineID.EnableWindow(TRUE); } else { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("不支持设备类型")); else MessageBoxEx(NULL, _T("Not Support Machine-type!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } } bool CPasswordMng::OperatePassword(int nOperateType, STOperDBPassword stOperDB, CString strOldPassword) { CString strSql = _T(""); CString strErr = _T(""); switch(nOperateType) { case enCreatePassword: if (1 == stOperDB.nDevType) { strSql.Format(_T("insert into password_info(DevType, DevPassword) values(%d, '%s')"), stOperDB.nDevType, stOperDB.strPassword); } else if(2 == stOperDB.nDevType) { strSql.Format(_T("insert into password_info(DevType,DevPassword,DevName) values(%d,'%s','%s')"), stOperDB.nDevType, stOperDB.strPassword,stOperDB.strDevName); } else { strErr.Empty(); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("不支持设备类型%d"), stOperDB.nDevType); AfxMessageBox(strErr.GetBuffer(0)); } else { strErr.Format(_T("Not support device_type = %d"), stOperDB.nDevType); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } break; case enModifyPassword: strSql.Format(_T("update password_info set DevPassword = '%s' where ID = %d"), stOperDB.strPassword, stOperDB.nTableID); break; case enDeletePassword: strSql.Format(_T("delete from password_info where ID = %d"),stOperDB.nTableID); break; default: if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("不支持操作数据库类型%d"), stOperDB.nDevType); AfxMessageBox(strErr.GetBuffer(0)); } else { strErr.Format(_T("Not support operation_db_type = %d"), nOperateType); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } _CommandPtr pCmdPro = NULL; pCmdPro.CreateInstance(_uuidof(Command)); pCmdPro->ActiveConnection = m_pConnection; try { CString szOrder=_T(""); CString szResBuff = _T(""); CString szRes = _T(""); CString strShowInfo = _T(""); //如果这个时候是GD10,则下发相应的命令给GD10, CDevice *pDev = NULL; //如果是GD10的设备,首先进行密码的校验 if (enGD10Type == (m_cmbMachineType.GetCurSel()+1)) { pDev = (CDevice*)(m_cmbMachineID.GetItemDataPtr(m_cmbMachineID.GetCurSel())); if (NULL == pDev) { if (LANG_ZHCN == g_iUILanguage) { AfxMessageBox(_T("获取设备指针为空")); } else { MessageBoxEx(NULL, _T("Get Device-Ptr Failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } szOrder.Format(_T("check_password(\"%s\")\r\n"),strOldPassword); if (!pDev->ExecuteOrder(szOrder, ">", &szResBuff)) { if (LANG_ZHCN == g_iUILanguage) { strShowInfo.Format(_T("执行命令 %s 失败!!!"), szOrder); AfxMessageBox(strShowInfo.GetBuffer(0)); } else { strShowInfo.Format(_T("Excute cmd %s failed!!!"), szOrder); MessageBoxEx(NULL, strShowInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } if (-1 == szResBuff.Find("]")) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("此功能在设备中不支持,请检查您的gd-20版本!")); else MessageBoxEx(NULL, _T("This function is not supported in device, please check your gd-20 version!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } GetSubStringInHeadAndTail(szResBuff, szRes, _T("["), _T("]")); if (_T("1") != szRes) { //strShowInfo.Empty(); //strShowInfo.Format(_T("check old password error in gd-10")); if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("检查旧密码错误在gd-10")); else MessageBoxEx(NULL, _T("Check old password error in gd-10"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } m_pConnection->BeginTrans(); /* strSql=_T("select * from password_info");*/ pCmdPro->CommandText = strSql.AllocSysString(); pCmdPro->Execute(NULL, NULL, adCmdText); if (enGD10Type == (m_cmbMachineType.GetCurSel()+1)) { szOrder.Empty(); szResBuff.Empty(); szRes.Empty(); pDev = (CDevice*)(m_cmbMachineID.GetItemDataPtr(m_cmbMachineID.GetCurSel())); //如果新设置的密码为空,则表示无密码,底下没有密码的时候设置一个空格字符即可 CString strDevPass = stOperDB.strPassword.IsEmpty() ? _T(" ") : stOperDB.strPassword; szOrder.Format(_T("set_param(\"password,%s;\")\r\n"),strDevPass); if (!pDev->ExecuteOrder(szOrder, "]", &szResBuff)) { strShowInfo.Empty(); if (LANG_ZHCN == g_iUILanguage) { strShowInfo.Format(_T("执行命令 %s 错误!!!"), szOrder); AfxMessageBox(strShowInfo.GetBuffer(0)); } else { strShowInfo.Format(_T("Excute cmd %s failed!!!"), szOrder); MessageBoxEx(NULL, strShowInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } GetSubStringInHeadAndTail(szResBuff, szRes, _T("["), _T("]")); if (_T("1") != szRes) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("GD-10设备设置密码错误")); else MessageBoxEx(NULL, _T("Set password error in gd-10!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); m_pConnection->RollbackTrans(); return false; } } m_pConnection->CommitTrans(); return true; } catch (_com_error e) { hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); AfxMessageBox(e.Description()); m_pConnection->RollbackTrans(); return false; } return true; } void CPasswordMng::OnOK() { // TODO: Add extra validation here if (!UpdateData(TRUE)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("数据输入错误")); else MessageBoxEx(NULL, _T("Data input error!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } //在这里需要加个对密码的校验判断的功能,不能出现特殊字符 STOperDBPassword stOperDBPass; stOperDBPass.nDevType = m_cmbMachineType.GetCurSel()+1; //如果选择的是GD10,则获取设备名称 if (enGD10Type == stOperDBPass.nDevType) { if ((m_cmbMachineID.GetCount() < 1) || (CB_ERR == m_cmbMachineID.GetCurSel())) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("设备类型信息错误")); else MessageBoxEx(NULL, _T("Machine_type information error!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return ; } m_cmbMachineID.GetLBText(m_cmbMachineID.GetCurSel(),stOperDBPass.strDevName); } CString strKey = (enGD10Type == stOperDBPass.nDevType) ? stOperDBPass.strDevName : _T("Geomative"); std::map::iterator iter = m_mapPasswordMng.find(strKey); int nOperTypeSel = m_cmbOperType.GetCurSel(); CString strOldSetPass = _T(""); switch (nOperTypeSel) { case enCreatePassword: if (m_edNewPass.IsEmpty()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("新密码不能为空!")); else MessageBoxEx(NULL, _T("New password can not be empty!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (iter != m_mapPasswordMng.end()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("设备已设置密码!")); else MessageBoxEx(NULL, _T("There is already set password for device!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (!VerifyPassword(m_edNewPass)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("输入新密码无效,密码必须由数字和字母组成!")); else MessageBoxEx(NULL, _T("Input new password illeagal,password must be compose of number and letter!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } stOperDBPass.strPassword = m_edNewPass; break; case enModifyPassword: if (iter == m_mapPasswordMng.end()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("设备密码未设置,无需修改!")); else MessageBoxEx(NULL, _T("The password have not be set for device,no need to modify!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (m_edNewPass.IsEmpty() || m_edOldPass.IsEmpty() || m_edConfirmPass.IsEmpty()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("设置密码错误,请检查!")); else MessageBoxEx(NULL, _T("Set password error,please check!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (m_edNewPass != m_edConfirmPass) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请确保新密码等于确认密码!")); else MessageBoxEx(NULL, _T("Plase ensure new password equal to confirm password!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (!VerifyPassword(m_edNewPass)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("输入新密码无效,密码必须由数字和字母组成!")); else MessageBoxEx(NULL, _T("Input new password illeagal,password must be compose of number and letter!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (m_edOldPass != iter->second.strPassword) { //如果此时和数据库的密码对不上,如果是GD10,还需要对和GD10主机去校验密码 //如果GD10主机密码通过,则认为校验密码通过 if (enGeomativeType == (m_cmbMachineType.GetCurSel()+1)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("旧密码错误")); else MessageBoxEx(NULL, _T("Old password error!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } } stOperDBPass.nTableID = iter->second.nTableID; stOperDBPass.strPassword = m_edNewPass; strOldSetPass = m_edOldPass; break; case enDeletePassword: if (iter == m_mapPasswordMng.end()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("设备密码未设置,无需删除!")); else MessageBoxEx(NULL, _T("The password have not be set for device,no need to delete!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } //在这里为什么使用m_edNewPass的原因参考ShowPasswordInfo中的注释 if (m_edNewPass != iter->second.strPassword) { if (enGeomativeType == (m_cmbMachineType.GetCurSel()+1)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("旧密码错误")); else MessageBoxEx(NULL, _T("Old password error!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } } //如果是删除的话,只需要获取该条记录的ID即可 stOperDBPass.nTableID = iter->second.nTableID; strOldSetPass = m_edNewPass; break; default: if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("不支持操作类型")); else MessageBoxEx(NULL, _T("Not support operation-type"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (!OperatePassword(nOperTypeSel,stOperDBPass,strOldSetPass)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("操作失败")); else MessageBoxEx(NULL, _T("Operation failed!!!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("操作成功")); else MessageBoxEx(NULL, _T("Operation success!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); CDialog::OnOK(); } bool CPasswordMng::VerifyPassword(CString strPass) { int nLen = strPass.GetLength(); char chInfo; for (int i = 0; i < nLen; i++) { chInfo = strPass[i]; if (!((chInfo >= '0' && chInfo <= '9') || (chInfo >= 'a' && chInfo <= 'z') || (chInfo >= 'A' && chInfo <= 'Z'))) { return false; } } return true; } void CPasswordMng::ShowPasswordInfo(int nOperType) { switch (nOperType) { case enCreatePassword: GetDlgItem(IDC_STATIC_NEW_PASS)->SetWindowText(_T("New Password:")); GetDlgItem(IDC_EDIT_OLD_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_CONFIRM_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_OLD_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_CONFIRM_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_NEW_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC_NEW_PASS)->ShowWindow(SW_SHOW); break; case enModifyPassword: GetDlgItem(IDC_STATIC_NEW_PASS)->SetWindowText(_T("New Password:")); GetDlgItem(IDC_EDIT_OLD_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT_CONFIRM_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC_OLD_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC_CONFIRM_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT_NEW_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC_NEW_PASS)->ShowWindow(SW_SHOW); break; case enDeletePassword: //为了界面的没关,在这里只显示中间的密码控件 //同时将界面上的提示由New Password 改为 Old Password //但是在转换为其它的操作方式适合需要改回去,那么在删除密码时获取的密码内容实际是来自于m_edNewPass GetDlgItem(IDC_STATIC_NEW_PASS)->SetWindowText(_T("Old Password:")); GetDlgItem(IDC_EDIT_OLD_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_CONFIRM_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_OLD_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_CONFIRM_PASS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_NEW_PASS)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC_NEW_PASS)->ShowWindow(SW_SHOW); break; default: CString strErr = _T(""); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("不支持操作数据库类型 = %d"), nOperType); AfxMessageBox(strErr.GetBuffer(0)); } else { strErr.Format(_T("Not support operation_db_type = %d"), nOperType); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } break; } return; }