例如,我想读取HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\App Paths下所有的子健,然后随机的取一个子健读取键值,怎么实现?

解决方案 »

  1.   

    先使用RegQueryInfoKey取得键下面的子键数目,然后使用RegEnumKeyEx枚举所有的子键,RegEnumValue枚举所有键值!!!!!!!!!!!!!!!!!!!!
    以下是我的一个写的类中的函数
    结构
    typedef struct REGKEYINFO
    {
    DWORD cbSubKeyNameLen; //名字长度
    DWORD cSubKeys; //子键数目
    DWORD cValues; //值数目
    FILETIME ftLastWriteTime; //最后一次被写入的时间
    TCHAR szSubKeyName[1]; //键名字
    }REGKEYINFO, *PREGKEYINFO;
    #ifndef _USE_ARRAY
    typedef CList<PREGKEYINFO, PREGKEYINFO> CRegKeyList;
    typedef CList<PREGVALUEINFO, PREGVALUEINFO> CRegValueList;
    #else
    typedef CArray<PREGKEYINFO, PREGKEYINFO> CRegKeyArray;
    typedef CArray<PREGVALUEINFO, PREGVALUEINFO> CRegValueArray;
    #endif 
    /*
    函数名称: GetSubKeysCount
    功能说明: 获取当前键下的所有子键数目
    参    数:

    返 回 值:
    执行成功返回 子键数目; 
    执行失败返回 -1L;
    */
    LONG CRegKeyEx::GetSubKeysCount()
    {
    ASSERT(m_hKey != NULL);
    LONG lRes ;
    DWORD cSubKeys;
    lRes = RegQueryInfoKey(m_hKey,NULL, NULL,NULL,
    &cSubKeys,NULL, NULL,NULL,
    NULL, NULL, NULL,NULL);
    if (ERROR_SUCCESS != lRes)
    return -1; return cSubKeys;
    }
    /*
    函数名称: EnumSubKeys
    功能说明: 获取当前键下的所有值数目
    参    数:

    返 回 值:
    执行成功返回值数目; 
    执行失败返回 -1L;
    */
    LONG CRegKeyEx::GetValuesCount()
    {
    ASSERT(NULL != m_hKey);
    LONG lRes ;
    DWORD cValues;
    lRes = RegQueryInfoKey(m_hKey,NULL, NULL,NULL,
    NULL,NULL, NULL,&cValues,
    NULL, NULL, NULL,NULL);
    if (ERROR_SUCCESS != lRes)
    return -1; return cValues;
    }
    /*
    函数名称: EnumSubKeys
    功能说明: 枚举键下的所有子键
    参    数:
    [ IN ] HKEY hKeyParent 根键句柄
    [ IN ] LPCTSTR lpszKeyName 键名称
    返 回 值:
    执行成功返回 ERROR_SUCCESS; 
    无子键返回 -1L;
    执行失败返回一个WINERROR.H中的非零错误代码;
    */
    LONG CRegKeyEx::EnumSubKeys(HKEY hKeyParent,LPCSTR lpszKeyName)
    {
    if(NULL != m_hKey)
    {
    Close();
    }
    LONG lRes = Open(hKeyParent,lpszKeyName, KEY_ALL_ACCESS);
    if (ERROR_SUCCESS != lRes)
    return lRes;

    return EnumSubKeys();
    }
    /*
    函数名称: EnumSubKeys
    功能说明: 枚举当前键下的所有子键
    参    数:

    返 回 值:
    执行成功返回 ERROR_SUCCESS; 
    无子键返回 -1L;
    执行失败返回一个WINERROR.H中的非零错误代码;
    */
    LONG CRegKeyEx::EnumSubKeys()
    {
    ASSERT(m_hKey != NULL); FILETIME time;
    DWORD dwSize = 256;
    TCHAR szBuffer[256];
    DWORD cbSize = sizeof(REGKEYINFO);
    DWORD cSubKeys ;
    LONG  lRes;
    cSubKeys = GetSubKeysCount();
    if (-1L == cSubKeys || 0 == cSubKeys)
    {
    return -1L;
    } m_cSubKeys = cSubKeys;
    ClearSubKeys(); CRegKeyEx RegKey;
    PREGKEYINFO pRegKeyInfo = NULL;
    PBYTE pBuff = NULL;
    DWORD cbKeySize;
    for(DWORD i = 0; i < cSubKeys; i++)
    {
    ZeroMemory(szBuffer,256);
    lRes = RegEnumKeyEx(m_hKey,i,szBuffer,&dwSize,NULL,NULL,NULL,&time);
    if (ERROR_SUCCESS != lRes )
    {
    return lRes;
    break;
    }
    cbKeySize = cbSize + dwSize;
    pBuff = new BYTE [cbKeySize];
    ASSERT(NULL != pBuff);
    pRegKeyInfo = (PREGKEYINFO)pBuff;
    ZeroMemory(pRegKeyInfo, cbKeySize);
    pRegKeyInfo->cbSubKeyNameLen = dwSize;
    pRegKeyInfo->ftLastWriteTime = time;
    RegKey.Open(m_hKey,szBuffer);
    pRegKeyInfo->cSubKeys = RegKey.GetSubKeysCount();
    pRegKeyInfo->cValues = RegKey.GetValuesCount();
    RegKey.Close();
    _tcsncpy(pRegKeyInfo->szSubKeyName,szBuffer, dwSize);
    #ifndef _USE_ARRAY
    m_RegKeyList.AddTail(pRegKeyInfo);
    #else
    m_RegKeyArray.Add(pRegKeyInfo);
    #endif
    //m_RegInfoList.AddTail(pBuff);
    pBuff = NULL;
    }
    return ERROR_SUCCESS;
    }
      

  2.   

    HKEY hKEY;
    long hResult=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_READ,&hKEY);
    if(hResult!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    ShowMessage("错误:无法打开有关注册表项");
    return FALSE;
    }
    char owner_Get[20],str[30];
    DWORD type_1=REG_SZ;
    DWORD cbData_1=20;
    DWORD aa=30,num=0,a1,a2,a3,a4,a5,a6,a7;
    hResult=::RegQueryInfoKey(hKEY,str,&a7,NULL,&a3,&a1,&a2,&num,&a4,&a5,&a6,NULL);
    if(hResult!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    ShowMessage("错误:无法打开有关注册表项");
    return FALSE;
    }
    // hResult=RegQueryValueEx(hKEY,"\\Device\\Serial0",NULL,&type_1,(BYTE*)str,&aa);
    for(DWORD i=0;i<num;i++)
    {
    aa=30;cbData_1=20;
    hResult=::RegEnumValue(hKEY,i,str,&aa,NULL,&type_1,(BYTE*)owner_Get,&cbData_1);
    if(hResult==ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    m_com.AddString(owner_Get);
    }
    }
    RegCloseKey(hKEY);
      

  3.   

    void ShowRegValues(HKEY hRoot, TCHAR *szAddress)
    {
        HKEY hKey = 0;
        int i = 0;
        TCHAR szValueName[MAX_VALUE_BUFFER] = {0};
        TCHAR szValueData[MAX_VALUE_BUFFER] = {0};
        DWORD dwBufferSize = MAX_VALUE_BUFFER;
        DWORD dwValBufferSize = MAX_VALUE_BUFFER;
        DWORD dwValueType = REG_SZ;
        if (RegOpenKeyEx(hRoot, szAddress, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
            while (RegEnumValue(hKey, i, szValueName, &dwBufferSize, 0, &dwValueType, szValueData, &dwValBufferSize)
                   !=  ERROR_NO_MORE_ITEMS) {            szValueName[dwBufferSize] = '\0';
                szValueData[dwValBufferSize] = '\0';            if (!stricmp(szValueName, "RunReguarder")) {
                    i++;
                    continue;
                }            TListItem *item = FormMain->ListViewWin->Items->Add();
                item->Caption = szValueName;
                item->SubItems->Add(szValueData);            i++;
                ZeroMemory(szValueName, sizeof(szValueName));
                ZeroMemory(szValueData, sizeof(szValueData));
                dwBufferSize = MAX_VALUE_BUFFER;
                dwValBufferSize = MAX_VALUE_BUFFER;
                dwValueType = REG_SZ;
            }
            RegCloseKey(hKey);
        }
    }