我写的代码能列举注册表所有子项,删除该怎么写?在线等ing...

BAO BAO 2015-08-16 06:13:27
下面的代码 不能列举出所有子项,我想改写成删除,怎么改写?

#include <windows.h>
#include <stdio.h>

BOOL QueryKey(HKEY RootKey, char *pSubKey)
{
HKEY hKey;
TCHAR lpName[255]; // buffer for subkey name
TCHAR SubKeyTemp[255];
DWORD dwIndex,cbName; // ,size of name string
DWORD lpcSubKeys=0; // number of subkeys
BOOL flag = TRUE;
if(RegOpenKeyEx( RootKey,TEXT(pSubKey),0,KEY_READ,&hKey) != ERROR_SUCCESS) flag = FALSE;
if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL) != ERROR_SUCCESS) flag = FALSE;
if (lpcSubKeys)
{
for (dwIndex=0; dwIndex < lpcSubKeys; dwIndex++)
{ cbName = 255;
if (RegEnumKeyEx(hKey, dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
printf("%s\n", lpName);
sprintf(SubKeyTemp,"%s\\%s",pSubKey,lpName);
QueryKey(RootKey,SubKeyTemp);
}
else flag = FALSE;
}
} //else RegDeleteKey();只想用这个api 但是这个api删除时要求不能有子项 也只能从最低层 删除 。。怎么改写
RegCloseKey(hKey);
return flag;
}

int main(void)
{
QueryKey(HKEY_CURRENT_USER,"Software\\Tencent");
}
...全文
263 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
纵横车 2015-08-17
  • 打赏
  • 举报
回复
引用 2 楼 wqte45 的回复:
这样修改 确实可以删除很复杂的目录树 只是我不明白 为什么你把 if (RegEnumKeyEx(hKey, 0, lpName, &cbName, NULL, NULL, NULL, NULL) == 0) 第二个参数修改为0 是什么意思 ,只枚举自建的第一个吗?
先取第一个,然后把第一个删除,删除之后原第二个就变成第一个了。
BAO BAO 2015-08-17
  • 打赏
  • 举报
回复
2楼的代码可以说基本能实现删除注册表子健以及下面的所有子健 但修改了代码 并不是按照反向枚举删除的(原本的枚举所有子健是按照从根键到子健的顺序)

2楼的代码 遇到下面的情况时候 就会发生应该删除的子健却没有删除

如: 子健5我设置了拒绝权限,但子健7 跟6 却删除不掉

该怎么解决?
赵4老师 2015-08-17
  • 打赏
  • 举报
回复
Registry Functions The following functions are used with the registry: RegCloseKey RegConnectRegistry RegCreateKey RegCreateKeyEx RegDeleteKey RegDeleteValue RegEnumKey RegEnumKeyEx RegEnumValue RegFlushKey RegGetKeySecurity RegLoadKey RegNotifyChangeKeyValue RegOpenKey RegOpenKeyEx RegQueryInfoKey RegQueryMultipleValues RegQueryValue RegQueryValueEx RegReplaceKey RegRestoreKey RegSaveKey RegSetKeySecurity RegSetValue RegSetValueEx RegUnLoadKey
BAO BAO 2015-08-17
  • 打赏
  • 举报
回复
这样修改 确实可以删除很复杂的目录树 只是我不明白 为什么你把 if (RegEnumKeyEx(hKey, 0, lpName, &cbName, NULL, NULL, NULL, NULL) == 0) 第二个参数修改为0 是什么意思 ,只枚举自建的第一个吗?
BAO BAO 2015-08-17
  • 打赏
  • 举报
回复
好的 厉害啊 向你学习。。。。 分太少了 就这么多了 有就多给你了 你逻辑思路真清晰啊 我遇到变量多的 循环多的 递归就乱
纵横车 2015-08-17
  • 打赏
  • 举报
回复
for (dwIndex=0; dwIndex < lpcSubKeys;dwIndex++) 只控制循环次数。 1.如果没有权限问题的话RegEnumKeyEx()每次都枚举出第0项然后把第0项删除,删除后后原第1项就会变成第0项,所以每次都只删除第0项就好了,而dwIndex在逐次增加,所以不能用dwIndex来索引。 2.即使没有权限也不会枚举失败只会删除失败,没有权限就像是可以看但不能动。
BAO BAO 2015-08-17
  • 打赏
  • 举报
回复
_dwIndex是说明要删除的项,先从0开始,如果有一项删不掉就_dwIndex++,跳过这一项。 1.用for (dwIndex=0; dwIndex < lpcSubKeys;dwIndex++) 里面的 dwIndex++ 不能跳吗 为啥多定义一个变量? 2.另外 你是判断if(QueryKey(hKey,lpName) == false) _dwIndex++; 来跳过 我写到else里面不行啊 RegEnumKeyEx不能判断枚举失败吗? 不是有权限 这个为啥不提示 Enum Error else { _dwIndex++ cout<<"Enum Error"<<endl; flag = FALSE; }
纵横车 2015-08-17
  • 打赏
  • 举报
回复
引用 10 楼 wqte45 的回复:
倒序 for (dwIndex=lpcSubKeys; dwIndex >= 0;dwIndex--) 这样不行试了 可能没写好吧 @a1193561652 你能给我解释下 那个 int _dwIndex = 0; for (dwIndex=0; dwIndex < lpcSubKeys;dwIndex++) _dwIndex 是什么意思啊 不是应该dwIndex--吗 呵呵 有点看不懂
要倒序应该写为for (dwIndex=lpcSubKeys-1; dwIndex >= 0;dwIndex--) _dwIndex是说明要删除的项,先从0开始,如果有一项删不掉就_dwIndex++,跳过这一项。
BAO BAO 2015-08-17
  • 打赏
  • 举报
回复
倒序 for (dwIndex=lpcSubKeys; dwIndex >= 0;dwIndex--) 这样不行试了 可能没写好吧 @a1193561652 你能给我解释下 那个 int _dwIndex = 0; for (dwIndex=0; dwIndex < lpcSubKeys;dwIndex++) _dwIndex 是什么意思啊 不是应该dwIndex--吗 呵呵 有点看不懂
纵横车 2015-08-17
  • 打赏
  • 举报
回复
引用 7 楼 wqte45 的回复:
@a1193561652 我试了下 直接判断函数返回值来判断执行失败 跳过执行下一个 思路很好 你修改的代码 还是删除不掉6 跟7 我是把5设置为完全控制:拒绝。 但6跟7 是在5 上级的 应该能删除吧。 还是谢谢你啦 你很聪明啊 我要向你学学习。
我这边试了可以删除6和7的呀,你看看是不是把6和7的权限也改了?
赵4老师 2015-08-17
  • 打赏
  • 举报
回复
试试倒着删除,即从后往前遍历,删除满足条件的项。
BAO BAO 2015-08-17
  • 打赏
  • 举报
回复
@a1193561652 我试了下 直接判断函数返回值来判断执行失败 跳过执行下一个 思路很好 你修改的代码 还是删除不掉6 跟7 我是把5设置为完全控制:拒绝。 但6跟7 是在5 上级的 应该能删除吧。 还是谢谢你啦 你很聪明啊 我要向你学学习。
纵横车 2015-08-17
  • 打赏
  • 举报
回复
引用 4 楼 wqte45 的回复:
2楼的代码可以说基本能实现删除注册表子健以及下面的所有子健 但修改了代码 并不是按照反向枚举删除的(原本的枚举所有子健是按照从根键到子健的顺序) 2楼的代码 遇到下面的情况时候 就会发生应该删除的子健却没有删除 如: 子健5我设置了拒绝权限,但子健7 跟6 却删除不掉 该怎么解决?
BOOL QueryKey(HKEY RootKey, char *pSubKey)
{ 
    HKEY hKey;
    TCHAR lpName[255];           // buffer for subkey name
    TCHAR SubKeyTemp[255];
    DWORD dwIndex,cbName;        // ,size of name string
    DWORD lpcSubKeys=0;             // number of subkeys 
    BOOL  flag = TRUE;
    if(RegOpenKeyEx( RootKey,pSubKey,0,KEY_READ,&hKey) != 0)
		flag = false;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL) != 0)
		flag = false;
    if (lpcSubKeys)
    {
		int _dwIndex = 0;
        for (dwIndex=0; dwIndex < lpcSubKeys;dwIndex++)
        {     
			cbName = 255;
            if (RegEnumKeyEx(hKey, _dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL) == 0) 
            {
                printf("key : %s\n", lpName);
				if(QueryKey(hKey,lpName) == false)
					_dwIndex++;
            }   
            else
			{
				cout<<"Enum Error"<<endl;
				flag = FALSE;
			}
        }
		
    }        //else RegDeleteKey();只想用这个api  但是这个api删除时要求不能有子项   也只能从最低层 删除  。。怎么改写
	if(RegDeleteKey(RootKey,pSubKey) == 0)
		cout<<pSubKey<<" : Delete\n";
	else
		flag = false;
    RegCloseKey(hKey);
    return flag;
}
又改了下,这个应该是没有权限删不了,有权限的都能删了。
纵横车 2015-08-16
  • 打赏
  • 举报
回复
BOOL QueryKey(HKEY RootKey, char *pSubKey)
{ 
    HKEY hKey;
    TCHAR lpName[255];           // buffer for subkey name
    TCHAR SubKeyTemp[255];
    DWORD dwIndex,cbName;        // ,size of name string
    DWORD lpcSubKeys=0;             // number of subkeys 
    BOOL  flag = TRUE;
    if(RegOpenKeyEx( RootKey,pSubKey,0,KEY_READ,&hKey) != 0)
		flag = FALSE;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL) != 0)
		flag = FALSE;
    if (lpcSubKeys)
    {
        for (dwIndex=0; dwIndex < lpcSubKeys; dwIndex++)
        {     
			cbName = 255;
            if (RegEnumKeyEx(hKey, 0, lpName, &cbName, NULL, NULL, NULL, NULL) == 0) 
            {
                printf("key : %s\n", lpName);
				QueryKey(hKey,lpName);
                //sprintf((char*)SubKeyTemp,"%s\\%s",pSubKey,lpName);
                //QueryKey(RootKey,(char*)SubKeyTemp);
            }   
            else
			{
				cout<<"Enum Error"<<endl;
				flag = FALSE;
			}
        }
		
    }        //else RegDeleteKey();只想用这个api  但是这个api删除时要求不能有子项   也只能从最低层 删除  。。怎么改写
	if(RegDeleteKey(RootKey,pSubKey) == 0)
		cout<<pSubKey<<" : Delete\n";
    RegCloseKey(hKey);
    return flag;
}

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧