ITPub博客

首页 > 应用开发 > IT综合 > 用VC6编写注册表管理程序(三) (转)

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

原创 IT综合 作者:amyz 时间:2007-11-28 11:26:24 0 删除 编辑
用VC6编写注册表管理程序(三) (转)[@more@]

用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

以上代码程序VC6、win98调试通过。

 

参考资料: Barretto VN的DriveExplorer Version 1.0

codeproject的reglistctrl

  Winapi32

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-985536/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3984
  • 访问量
    7334901