如何读取一个注册表子健下所有的子健? 例如,我想读取HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\App Paths下所有的子健,然后随机的取一个子健读取键值,怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先使用RegQueryInfoKey取得键下面的子键数目,然后使用RegEnumKeyEx枚举所有的子键,RegEnumValue枚举所有键值!!!!!!!!!!!!!!!!!!!!以下是我的一个写的类中的函数结构typedef struct REGKEYINFO{ DWORD cbSubKeyNameLen; //名字长度 DWORD cSubKeys; //子键数目 DWORD cValues; //值数目 FILETIME ftLastWriteTime; //最后一次被写入的时间 TCHAR szSubKeyName[1]; //键名字}REGKEYINFO, *PREGKEYINFO;#ifndef _USE_ARRAYtypedef CList<PREGKEYINFO, PREGKEYINFO> CRegKeyList;typedef CList<PREGVALUEINFO, PREGVALUEINFO> CRegValueList;#elsetypedef 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;} 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); 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); }} 请问怎么使用mciSendCommand调节MP3的音量 想做软件界面开发,类似360,QQ那样的界面,哪里有资料? 请问如何在全屏后的子窗口获得鼠标点击的坐标值? 求助,关于SAPI开发语音合成 EXE给DLL传递参数?应该怎么传啊 CFileDialog的问题 做DVR的朋友能进来聊聊吗? 请教:什么实现颜色的均匀分布? 高分求教: 换盘时出现的问题? 请大家多抒己见. ★-那位高手可以给我详细介绍一下UpdateData()函数,我看了msdn,还是不太明? 问一个Activex的简单概念 零长度数组问题
以下是我的一个写的类中的函数
结构
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;
}
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);
{
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);
}
}