// RegisterDlg.cpp : 实现文件 // #include "stdafx.h" #include "2015Remote.h" #include "RegisterDlg.h" #include "afxdialogex.h" enum MYKEY { MHKEY_CLASSES_ROOT, MHKEY_CURRENT_USER, MHKEY_LOCAL_MACHINE, MHKEY_USERS, MHKEY_CURRENT_CONFIG }; enum KEYVALUE { MREG_SZ, MREG_DWORD, MREG_BINARY, MREG_EXPAND_SZ }; // CRegisterDlg 对话框 IMPLEMENT_DYNAMIC(CRegisterDlg, CDialog) CRegisterDlg::CRegisterDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject) : DialogBase(CRegisterDlg::IDD, pParent, IOCPServer, ContextObject, IDI_ICON_STRING) { m_bIsClosed = FALSE; m_bIsWorking = FALSE; } CRegisterDlg::~CRegisterDlg() { Mprintf("~CRegisterDlg \n"); } void CRegisterDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE, m_Tree); DDX_Control(pDX, IDC_LIST, m_ControlList); } BEGIN_MESSAGE_MAP(CRegisterDlg, CDialog) ON_WM_CLOSE() ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, &CRegisterDlg::OnTvnSelchangedTree) END_MESSAGE_MAP() // CRegisterDlg 消息处理程序 BOOL CRegisterDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // TODO: 在此添加额外的初始化 CString str; str.Format("%s - 注册表管理", m_IPAddress); SetWindowText(str); m_ImageListTree.Create(18, 18, ILC_COLOR16,10, 0); //制作 树控件上的图标 auto hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_FATHER), IMAGE_ICON, 18, 18, 0); m_ImageListTree.Add(hIcon); hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_DIR), IMAGE_ICON, 18, 18, 0); m_ImageListTree.Add(hIcon); m_Tree.SetImageList(&m_ImageListTree,TVSIL_NORMAL); m_hRoot = m_Tree.InsertItem("注册表管理",0,0,0,0); //0 HKCU = m_Tree.InsertItem("HKEY_CURRENT_USER",1,1,m_hRoot,0); //1 HKLM = m_Tree.InsertItem("HKEY_LOCAL_MACHINE",1,1,m_hRoot,0); HKUS = m_Tree.InsertItem("HKEY_USERS",1,1,m_hRoot,0); HKCC = m_Tree.InsertItem("HKEY_CURRENT_CONFIG",1,1,m_hRoot,0); HKCR = m_Tree.InsertItem("HKEY_CLASSES_ROOT",1,1,m_hRoot,0); m_Tree.Expand(m_hRoot,TVE_EXPAND); m_ControlList.InsertColumn(0,"名称",LVCFMT_LEFT,150,-1); m_ControlList.InsertColumn(1,"类型",LVCFMT_LEFT,60,-1); m_ControlList.InsertColumn(2,"数据",LVCFMT_LEFT,300,-1); m_ControlList.SetExtendedStyle(LVS_EX_FULLROWSELECT); //////添加图标////// m_ImageListControlList.Create(16,16,TRUE,2,2); m_ImageListControlList.Add(THIS_APP->LoadIcon(IDI_ICON_STRING)); m_ImageListControlList.Add(THIS_APP->LoadIcon(IDI_ICON_DWORD)); m_ControlList.SetImageList(&m_ImageListControlList,LVSIL_SMALL); m_isEnable = TRUE; //该值是为了解决频繁 向被控端请求 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CRegisterDlg::OnClose() { CancelIO(); // 等待数据处理完毕 if (IsProcessing()) { ShowWindow(SW_HIDE); return; } DialogBase::OnClose(); } void CRegisterDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); if(!m_isEnable) { return; } m_isEnable=FALSE;; TVITEM Item = pNMTreeView->itemNew; if(Item.hItem == m_hRoot) { m_isEnable=TRUE;; return; } m_hSelectedItem=Item.hItem; //保存用户打开的子树节点句柄 //0 1 2 2 3 m_ControlList.DeleteAllItems(); CString strFullPath=GetFullPath(m_hSelectedItem); //获得键值路径 char bToken=GetFatherPath(strFullPath); //[2] \1\2\3 //愈加一个键 int nitem=m_ControlList.InsertItem(0,"(默认)",0); m_ControlList.SetItemText(nitem,1,"REG_SZ"); m_ControlList.SetItemText(nitem,2,"(数据未设置值)"); strFullPath.Insert(0,bToken);//插入 那个根键 bToken=COMMAND_REG_FIND; strFullPath.Insert(0,bToken); //插入查询命令 [COMMAND_REG_FIND][x] m_ContextObject->Send2Client((LPBYTE)(strFullPath.GetBuffer(0)), strFullPath.GetLength()+1); m_isEnable = TRUE; *pResult = 0; } CString CRegisterDlg::GetFullPath(HTREEITEM hCurrent) { CString strTemp; CString strReturn = ""; while(1) { if(hCurrent==m_hRoot) { return strReturn; } strTemp = m_Tree.GetItemText(hCurrent); if(strTemp.Right(1) != "\\") strTemp += "\\"; strReturn = strTemp + strReturn; hCurrent = m_Tree.GetParentItem(hCurrent); //得到父的 } return strReturn; } char CRegisterDlg::GetFatherPath(CString& strFullPath) { char bToken; if(!strFullPath.Find("HKEY_CLASSES_ROOT")) { //判断主键 bToken=MHKEY_CLASSES_ROOT; strFullPath.Delete(0,sizeof("HKEY_CLASSES_ROOT")); } else if(!strFullPath.Find("HKEY_CURRENT_USER")) { bToken=MHKEY_CURRENT_USER; strFullPath.Delete(0,sizeof("HKEY_CURRENT_USER")); } else if(!strFullPath.Find("HKEY_LOCAL_MACHINE")) { bToken=MHKEY_LOCAL_MACHINE; strFullPath.Delete(0,sizeof("HKEY_LOCAL_MACHINE")); } else if(!strFullPath.Find("HKEY_USERS")) { bToken=MHKEY_USERS; strFullPath.Delete(0,sizeof("HKEY_USERS")); } else if(!strFullPath.Find("HKEY_CURRENT_CONFIG")) { bToken=MHKEY_CURRENT_CONFIG; strFullPath.Delete(0,sizeof("HKEY_CURRENT_CONFIG")); } return bToken; } void CRegisterDlg::OnReceiveComplete(void) { m_bIsWorking = TRUE; switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_REG_PATH: { Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); AddPath(tmp.c_str()); break; } case TOKEN_REG_KEY: { Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); AddKey(tmp.c_str()); break; } default: // 传输发生异常数据 break; } m_bIsWorking = FALSE; } struct REGMSG { int count; //名字个数 DWORD size; //名字大小 DWORD valsize; //值大小 }; void CRegisterDlg::AddPath(char* szBuffer) { if(szBuffer==NULL) return; int msgsize=sizeof(REGMSG); REGMSG msg; memcpy((void*)&msg,szBuffer,msgsize); DWORD size =msg.size; int count=msg.count; if(size>0&&count>0) { //一点保护措施 for(int i=0; i