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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航