右边列表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; } |
到此数据的显示已经基本完成,余下为数据操作的代码
|