求助,VC MFC递归遍历注册表问题
本帖最后由 qq534888799 于 2011-12-01 08:01:13 编辑 先贴代码:
void CLxDlg::EnumerateKeyE(HKEY hKEY,LPCSTR key)
{
HKEY hkey;
if(::RegOpenKeyEx(hKEY,key,0,KEY_WRITE,&hkey) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
return;
}
char subkey[MAX_PATH+1]; //声明最大键长度
DWORD keylen = sizeof(subkey); //设置键实际长度
DWORD Index = 0; //键序数
while(::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMS)
{
HKEY h_key;
if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS)
{
EnumerateKeyE(h_key,subkey);
::RegCloseKey(h_key);
}
Index++;
keylen = sizeof(subkey); //设置键实际长度
}
}
我是这样调用的 EnumerateKeyE(SubKey,NULL); //遍历注册表
出现的问题是:
While循环那里,下面那个 RegOpenKeyEx , 递归的时候第二次调用时它打开也能成功,不过输出的结果却是乱码,以后的递归全都失败,意思就是说只能打开一级子键,但是子键下面的子键就打不开,下面是调试信息
名称 值
&h_key 0x0012f084 “?” <-- 第一次递归到这里时就是这样了
h_key 0x000001c0
hkey 0x80000001
subkey 0x0012f090 "AppEvents" <-- 这是调用时打开的第一个子键
this 0x0012fd5c
麻烦各位大虾帮我看下,我到底写错在哪里?
[最优解释]
BOOL GetComputerSetupSoftWareTxt()
{
const int MAX_LEG = 256 * sizeof(TCHAR);
HKEY hKey;
DWORD dwRegNum = MAX_LEG;
TCHAR regBufferName[MAX_LEG] = {0};
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),NULL, KEY_READ, &hKey) == ERROR_SUCCESS)
{
if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwRegNum, NULL, NULL, NULL, NULL, NULL, NULL, NULL)==ERROR_SUCCESS)
{
for(int i = 0; i < (int)dwRegNum; i++)
{
DWORD dwRegSize = MAX_LEG;
RegEnumKeyEx(hKey, i, regBufferName, &dwRegSize, NULL, NULL, NULL, NULL);
DWORD dwType;
HKEY hSubKey;
if(RegOpenKeyEx(hKey, regBufferName, NULL, KEY_READ, &hSubKey) == ERROR_SUCCESS)
{
TCHAR regBufferValue[MAX_LEG] = {0};
dwRegSize = MAX_LEG;
RegQueryValueEx(hSubKey, _T("DisplayName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
string displayName = regBufferValue;
if(displayName == _T(""))
{
continue;
}
_tcscpy_s(regBufferValue, _T(""));
RegQueryValueEx(hSubKey, _T("ParentKeyName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
string softwareType = regBufferValue;
}
}
}
}
else
{
return FALSE; //打开键失败
}
RegCloseKey(hKey);
return TRUE;
}
[其他解释]
DWORD keylen = sizeof(subkey); //设置键实际长度
改成 DWORD keylen = sizeof(subkey)+1;
[其他解释]
嗯,我去试试
[其他解释]
不行,还是老问题,不过这次是在While循环里面做死循环不出来了
[其他解释]
1.
if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS)
{
EnumerateKeyE(h_key,subkey);
这里的h_key已经是用subkey打开过的, 所以已经包含了subkey的路径,EnumerateKeyE(h_key,subkey) 就不对了
2. ::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMS
RegEnumKeyEx可能返回其他错误, 最好不要这么判断
[其他解释]
回复4楼:
能否给出第一个问题的具体解决方法
回复5楼:
正在尝试你的代码
[其他解释]
回复5楼:
我现在的问题是一级子键下面的键无法打开
你的搜索指定键是否存在,我现在还不需要这个
在线等,急急急。。。。。
[其他解释]
1.
if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS)
{
EnumerateKeyE(h_key,subkey);
这里的h_key已经是用subkey打开过的, 所以已经包含了subkey的路径,EnumerateKeyE(h_key,subkey) 就不对了
2. ::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMS
RegEnumKeyEx可能返回其他错误, 最好不要这么判断
[其他解释]
回复8楼:
你说的已经有人说过了。。。。。。
我不懂你为什么还要说一次,难道是别的意思?
能告诉我?
在线等 急急急。。。。。
[其他解释]
采用了5楼的代码,结贴