通过递归读取register所有信息的算法

本文介绍了一种将Windows注册表信息备份到XML文件的方法。通过递归遍历注册表键值,并利用CXmlNode创建节点来存储注册表项的名称、类型及数据。此过程涉及到RegEnumKey和RegEnumValue函数的使用。

这段代码是用来就某个hKey下的所有的信息写入到一个xmldoc中,该算法用一个递归函数实现

void CBackupRegister::LoopBackup(HKEY hKey, DWORD dwKeyIndex, CXmlNode currentNode, CString strLastName)
{
    HKEY hSubKey;
    TCHAR szKeyname[MAX_PATH 
+ 1];

    TCHAR szValue[
1024];
    TCHAR szValueName[MAX_PATH 
+ 1];
    DWORD dwValueName 
= MAX_PATH + 1;
    DWORD dwValueIndex 
= 0;
    DWORD dwValueType;
    DWORD dwValueSize;
    DWORD dwIndex 
= 0;

    
if( RegEnumKey(hKey, dwKeyIndex, szKeyname, MAX_PATH + 1== ERROR_SUCCESS)
    
{
        strLastName 
= szKeyname;
        CXmlNode node 
= m_xmlDoc.CreateNode(_T("RegSub"));
        m_xmlDoc.SetNodeAttribute(node, _T(
"RegName"), strLastName);
        currentNode.Append(node);
        currentNode 
= node;

        
while(RegEnumValue(hKey, dwValueIndex++, szValueName, &dwValueName, 0&dwValueType, LPBYTE(szValue), &dwValueSize) == ERROR_SUCCESS)
        
{
            CString strType, strValue;
            ParseValue(dwValueType, szValue, strType, strValue);

            node 
= m_xmlDoc.CreateNode(_T("RegValueName"));
            node.SetValue(szValueName);
            currentNode.Append(node);

            node 
= m_xmlDoc.CreateNode(_T("RegValueType"));
            node.SetValue(strType);
            currentNode.Append(node);

            node 
= m_xmlDoc.CreateNode(_T("RegValueData"));
            node.SetValue(strValue);
            currentNode.Append(node);
        }


        
if( RegOpenKeyEx(hKey, szKeyname, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
        
{
            LoopBackup(hSubKey, dwKeyIndex, currentNode, strLastName);
        }

    }

    
else
    
{
        
while(RegEnumValue(hKey, dwValueIndex++, szValueName, &dwValueName, 0&dwValueType, LPBYTE(szValue), &dwValueSize) == ERROR_SUCCESS)
        
{
            CString strType, strValue;
            ParseValue(dwValueType, szValue, strType, strValue);

            CXmlNode node 
= m_xmlDoc.CreateNode(_T("RegValueName"));
            node.SetValue(szValueName);
            currentNode.Append(node);

            node 
= m_xmlDoc.CreateNode(_T("RegValueType"));
            node.SetValue(strType);
            currentNode.Append(node);

            node 
= m_xmlDoc.CreateNode(_T("RegValueData"));
            node.SetValue(strValue);
            currentNode.Append(node);
        }

    }


    
while(RegEnumKey(hKey, ++dwKeyIndex, szKeyname, MAX_PATH + 1== ERROR_SUCCESS)
    
{
        strLastName 
= szKeyname;
        CXmlNode node 
= m_xmlDoc.CreateNode(_T("RegSub"));
        m_xmlDoc.SetNodeAttribute(node, _T(
"RegName"), strLastName);
        currentNode 
= currentNode.GetParent();
        currentNode.Append(node);
        currentNode 
= node;

        
if( RegOpenKeyEx(hKey, szKeyname, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS)
        
{
            dwIndex 
= 0;
            LoopBackup(hSubKey, dwIndex, currentNode, strLastName);
        }

    }

}

 代码可以运行,不过不知为什么RegEnumKey函数只能读出hKey下的一部分数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值