用VC6编写注册表管理程序(三)

原创 2003年11月27日 00:31:00

VC6编写注册表管理程序(三)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

顾剑辉(Solarsoft)

 

右边列表CregExplorerView类的实现:

在类里定义private型的变量       HKEY m_hKey;//通信函数传来主键

CString m_strSubKey;//子键名

1.  和文档类进行通信的代码同上。

2.  显示当前树的数据

CRegLeftView::OnSelchanging中有一通信函数pDoc->m_RegExplorerView->

DoListView(hKey,strSubKey);

void CRegExplorerView::DoListView(HKEY hKey, LPCTSTR strSubKey)

{

       LV_ITEM  lvitem;

       int iActualItem;

       CString strTemp1="(默认)",strTemp2="(未设置类型)",strTemp3="(未设置键值)";

 

    m_hKey=hKey;

    m_strSubKey=strSubKey;

    lvitem.mask = LVIF_TEXT | LVIF_IMAGE;

       lvitem.iItem = 0;

       lvitem.iSubItem = 0;

       lvitem.pszText = strTemp1.GetBuffer(strTemp1.GetLength());

       lvitem.iImage =ICI_STR;

       iActualItem = GetListCtrl().InsertItem(&lvitem);

 

    GetListCtrl().SetItemText(iActualItem,1,strTemp2.GetBuffer(0));

          GetListCtrl().SetItemText(iActualItem,2,strTemp3.GetBuffer(0));

    EnumerateValues(hKey,strSubKey);//枚举该子键的所有数据项并显示在ListView

}

void CRegExplorerView::EnumerateValues(HKEY hKey, LPCTSTR cstrKey)

{

       static HKEY hLastKey = hKey;

       LONG lResult;

       DWORD dwIndex = 0;

       HKEY hCurKey = hKey;

       DWORD dwKeyType;

       DWORD dwKeyDataLength, dwKeyNameLen;

       LPBYTE pbbinKeyData = NULL;

       TCHAR *tcKeyName = NULL;

       TCHAR tcDataType[1024] = _T("");

       lResult = RegOpenKeyEx(hCurKey, cstrKey, 0, KEY_QUERY_VALUE , &hKey);

       if(lResult != ERROR_SUCCESS)

              return;

 

       DWORD lNoOfValues = 0;

       DWORD lLongestKeyNameLen = 1;

       DWORD lLongestDataLen = 1;

 

       lResult = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &lNoOfValues, &lLongestKeyNameLen, &lLongestDataLen,

                                                 NULL, NULL);

      

       if(lResult != ERROR_SUCCESS)

              return;

 

 

       hLastKey = hKey;

 

       lLongestKeyNameLen++;

       lLongestDataLen++;

 

       tcKeyName =       new TCHAR[lLongestKeyNameLen];

       pbbinKeyData = new BYTE[lLongestDataLen];

 

       CString cstrFinalData, cstrTemp;

 

       while(TRUE)

       {

              memset(pbbinKeyData, 0, lLongestDataLen);

              memset(tcKeyName, 0, lLongestKeyNameLen);

              dwKeyType = dwKeyDataLength = dwKeyNameLen = 0;

 

              dwKeyNameLen = lLongestKeyNameLen;

              dwKeyDataLength = lLongestDataLen;

 

              lResult = RegEnumValue(hKey, dwIndex, tcKeyName, &dwKeyNameLen, NULL, &dwKeyType, pbbinKeyData, &dwKeyDataLength);

              if(lResult == ERROR_NO_MORE_ITEMS)

                     break;

        AddRegistryItem(tcKeyName, dwKeyType, pbbinKeyData, dwKeyDataLength, dwIndex);//显示数据于ListView

 

              dwIndex++;

       }

       RegCloseKey(hKey);

       delete tcKeyName;

       delete pbbinKeyData;

}

int CRegExplorerView::AddRegistryItem(CString Name, DWORD Type, void *Data, DWORD DataSize, int Row)

{

       if (Name.IsEmpty())

       {

           DeleteAllItems();

              Name="(默认)";

       }

       LVITEM Item={0};

       Item.mask=LVIF_TEXT | LVIF_IMAGE;

       Item.cchTextMax=Name.GetLength();

       Item.iItem=Row;

       Item.pszText=Name.GetBuffer(0);

       int iPosition;

 

       CString FormatData;

      

       switch (Type)

       {

              case REG_DWORD_BIG_ENDIAN:

              case REG_DWORD: 

              {

                     Item.iImage=1;

                     iPosition=GetListCtrl().InsertItem(&Item);

                     GetListCtrl().SetItemText(iPosition,1,"REG_DWORD");

                     DWORD* dwData=(DWORD*) Data;

                    

                     if (Data!=NULL)

                     {

                            FormatData.Format("0x%x (%d)",*dwData,*dwData);

                            GetListCtrl().SetItemText(iPosition,2,FormatData.GetBuffer(0));

                     }

                     break;

              }

 

              case REG_BINARY:

              {

                     Item.iImage=1;

                     iPosition=GetListCtrl().InsertItem(&Item);

                     GetListCtrl().SetItemText(iPosition,1,"REG_BINARY");

                     if (Data!=NULL)

                     {

                            FormatData=FormatBinary((BYTE*) Data,DataSize);

                            GetListCtrl().SetItemText(iPosition,2,FormatData.GetBuffer(0));

                     }

                     break;

              }

             

              case REG_EXPAND_SZ:

              case REG_SZ:

              case REG_LINK:

              case REG_MULTI_SZ:

              {

                     Item.iImage=0;

                     iPosition=GetListCtrl().InsertItem(&Item);

                     GetListCtrl().SetItemText(iPosition,1,"REG_SZ");

                            if (Data!=NULL)

                     {

                            FormatData.Format("/"%s/"",(char*) Data);

                            GetListCtrl().SetItemText(iPosition,2,FormatData.GetBuffer(0));

                     }

                     break;

              }

 

              default:

              {

                     Item.mask=LVIF_TEXT;

                     iPosition=GetListCtrl().InsertItem(&Item);

                     GetListCtrl().SetItemText(iPosition,1,"REG_NONE");

                     break;

              }

       }

 

       return iPosition;

}

到此数据的显示已经基本完成,余下为数据操作的代码

3.  操作当前值,双击名称项,弹出对话框,需实现鼠标的双击消息NM_DBLCLK

 

void CRegExplorerView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)

{

    OnRegModify();

       *pResult = 0;

}

OnRegModify()是为配合菜单的自定义消息

void CRegExplorerView::OnRegModify()

{

       long lResult;

       ASSERT(m_hKey);

       if (GetListCtrl().GetSelectedCount()>1)

       {

              TRACE0("CRegistryListCtrl::OnRegModify -> Can not modify several values./n");

              return;

       }

 

       POSITION pos=GetListCtrl().GetFirstSelectedItemPosition();

      

       int SelectedItem=0;

       SelectedItem=GetListCtrl().GetNextSelectedItem(pos);

 

       CString ItemType=GetListCtrl().GetItemText(SelectedItem,1);

 

       if (ItemType.Compare("REG_SZ")==0)//||ItemType.Compare("(未设置类型)")==0)

       {    

              CRegEditStrDlg EditStrDlg;

              CString KeyName, KeyData;

              KeyName=GetListCtrl().GetItemText(SelectedItem,0);

              KeyData=GetListCtrl().GetItemText(SelectedItem,2);

              EditStrDlg.SetString(KeyName, KeyData);

    //    if(ItemType.Compare("(未设置类型)")==0)

       //            KeyName="";

 

              if (EditStrDlg.DoModal()==IDOK)

              {

                     EditStrDlg.GetString(KeyName, KeyData);

 

                     DWORD dwDataSize=KeyData.GetLength();

                  HKEY hKey;

                     RegOpenKey(m_hKey, m_strSubKey, &hKey);

                     RegSetValueEx(hKey, KeyName, 0, REG_SZ, (BYTE*) KeyData.GetBuffer(0), dwDataSize);

                     RegCloseKey(hKey);

              }

       }

 

       if (ItemType.Compare("REG_DWORD")==0)

       {

              CRegEditDwordDlg EditDWORDDlg;

              CString KeyName=GetListCtrl().GetItemText(SelectedItem,0);

      

              DWORD KeyData;

              DWORD DataSize;

              HKEY hKey;

              DWORD dwType=REG_DWORD;

              DataSize=sizeof(DataSize);

           lResult = RegOpenKeyEx(m_hKey, m_strSubKey, 0, KEY_QUERY_VALUE , &hKey);

           if(lResult != ERROR_SUCCESS)

                 return;      

 

              lResult=RegQueryValueEx(hKey, KeyName, 0, &dwType,(BYTE*) &KeyData, &DataSize);

           if(lResult != ERROR_SUCCESS)

                 return;

 

              EditDWORDDlg.SetStringDWORD(KeyName, KeyData);

             

              if (EditDWORDDlg.DoModal()==IDOK)

              {

                     EditDWORDDlg.GetStringDWORD(KeyName, KeyData);

                     RegSetValueEx(hKey, KeyName, 0, REG_DWORD, (BYTE*) &KeyData, DataSize);

              }

 

              RegCloseKey(hKey);

       }

 

       if (ItemType.Compare("REG_BINARY")==0)

       {

              CString KeyName=GetListCtrl().GetItemText(SelectedItem, 0);

              CRegEditBinDlg EditBinaryDlg;

 

              HKEY hKey;

              BYTE Data[1024]="";

              DWORD dwDataSize=sizeof(Data);

              DWORD dwType=REG_BINARY;

              RegOpenKey(m_hKey, m_strSubKey, &hKey);

              RegQueryValueEx(hKey, KeyName, 0, &dwType, Data, &dwDataSize);

              EditBinaryDlg.SetStringData(KeyName, Data, dwDataSize);

 

              if (EditBinaryDlg.DoModal()==IDOK)

              {

                     EditBinaryDlg.GetStringData(KeyName, Data, dwDataSize);

                     RegSetValueEx(hKey, KeyName, 0, REG_BINARY, Data, dwDataSize);

              }

 

              RegCloseKey(hKey);

       }    

}

数据的显示与操作的代码已经基本结束。附:工程资料

要下载到http://solarsoft.126.com

以上代码程序VC6Win98中调试通过。

 

参考资料: Barretto VNDriveExplorer Version 1.0

codeprojectreglistctrl

         WinAPI32

 

用VC6编写注册表管理程序

用VC6编写注册表管理程序(-)顾剑辉(Solarsoft)摘要 本文给出了一个较完整的注册表管理程序,对类似注册表管理程序的开发作了详细的介绍关键字 REGEDIT,注册表管理在市面上,有很多注册表...
  • solarsoft
  • solarsoft
  • 2003年11月27日 00:31
  • 1349

用VC6编写注册表管理程序(二)

用VC6编写注册表管理程序(二)               顾剑辉(Solarsoft)1.  用树来显示注册表信息。注意:注册表信息内容比较多,不可能全部显示,则可一开始,先显示最接近于树根,再根...
  • solarsoft
  • solarsoft
  • 2003年11月27日 00:31
  • 1087

vc6 删除注册表信息

在系统盘里找到WINDOWS文件夹再在里面找到regedit.exe。打开注册表,然后选择HKEY_LOCAL_MACHINE里面的SOFTWARE,再在那里面自己找一下和vc++有关的吧!...
  • jphaoren
  • jphaoren
  • 2010年07月20日 10:34
  • 566

数据结构:栈和队列-迷宫问题求解

//--------------------文件名:Maze.cpp------------------------//----------------------By SunxySong------...
  • sunxysong
  • sunxysong
  • 2005年05月27日 08:28
  • 5288

VC6修改注册表来改字体

老是忘记、每次都搜索。。记下来。。。: HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Format...
  • csCrazybing
  • csCrazybing
  • 2014年02月18日 22:42
  • 812

卸载VC6.0后清理相关注册表的方法

卸载VC6.0后重新安装会出现一些问题,这些问题主要是由于注册表没有清理完全的缘故 手动卸载VS6.0清理相关注册表的方法http://support.microsoft.com/kb/2483...
  • dancewyr
  • dancewyr
  • 2012年05月29日 14:04
  • 6821

VC读写注册表操作

读注册表:LONG lRtn; CString strSection(REG_SEC_APP); strSection += _T("//"); strSection += _lpszVersion;...
  • guoquan2003
  • guoquan2003
  • 2010年01月19日 12:21
  • 440

VC6.0制作的象棋游戏发布!!!

自从进入了暑假~发现了一本《Visual C++ 专业游戏程序设计》­看了之后,发现原来用VC来写游戏比想象中的要简单­不知道什么时候,突然自发灵感,想写一个象棋游戏试试看­虽然经历了很多曲折,某个错...
  • gouki04
  • gouki04
  • 2009年08月17日 11:52
  • 2553

自己动手写reg注册表文件

REG文件实际上是一种注册表脚本文件,双击REG文件即可将其中的数据导入到注册表中。通过约定的格式,我们可以利用REG文件直接对注册表进行任何修改操作,而且它对注册表的操作可以不受Regedit.ex...
  • haolipengzhanshen
  • haolipengzhanshen
  • 2015年01月12日 20:23
  • 7377

VC6 编写,调用 DLL

一:编程环境:VC6.01.编写Win32的DLL:   A.File->New->(Projects)Win32-Dynamic Link Library   指定Project Name,OK,选...
  • Yang_Seal
  • Yang_Seal
  • 2010年10月26日 17:23
  • 4624
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用VC6编写注册表管理程序(三)
举报原因:
原因补充:

(最多只允许输入30个字)