设为首页 加入收藏

TOP

用VC++6.0编写注册表管理程序(三)
2012-11-04 15:17:50 来源: 作者: 【 】 浏览:484
Tags:6.0 编写 注册表 管理 程序
  右边列表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;
}

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



首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇用Visual C++设计窗体探测器 下一篇密码漏洞原理及补丁程序设计

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: