用VC6编写注册表管理程序(三)
顾剑辉(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
以上代码程序VC6、Win98中调试通过。
参考资料: Barretto VN的DriveExplorer Version 1.0
codeproject的reglistctrl
WinAPI32
本文地址:http://com.8s8s.com/it/it1354.htm