帮忙修改下吧

时间:2022-09-04 14:33:51
#include <windows.h>
#include <stdio.h>
 
BOOL QueryKey(HKEY RootKey, char *pSubKey)

    HKEY hKey;
    TCHAR lpName[255];           // buffer for subkey name
    DWORD dwIndex,cbName;        // ,size of name string
    DWORD lpcSubKeys=0;          // number of subkeys 
    BOOL  flag = TRUE;
    if(RegOpenKeyEx(RootKey,pSubKey,0,KEY_READ,&hKey)) flag = FALSE;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL)) flag = FALSE;  
for (dwIndex=0; dwIndex < lpcSubKeys; dwIndex++)
{     
cbName = 255;
if (!RegEnumKeyEx(hKey, dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL)) 
{
if(!strcmp(lpName,"4")) {删除子健4}
QueryKey(hKey,lpName);
}
}
    RegCloseKey(hKey);
    return flag;
}

int main(void)
{
QueryKey(HKEY_CURRENT_USER,"Software\\Tencent");
}




这是枚举注册表子项TREE的代码  我想实现 枚举过程中,发现有子健名字4 就删除此子健tree 怎么修改啊

11 个解决方案

#1


上次不是有个删除表项的函数吗?拿过来直接用就好了。

#2


是能直接调用, 可两个函数 重复那么多代码   感觉不简洁   怎么在一个函数里实现呢

#3


可以在QueryKey函数里面加个nFlag参数,说明这个函数是要枚举还是要删除,在函数里面判断nFlag的值来确定RegCloseKey()之前要不要删除它等操作。这样大部分枚举历遍的代码可以重用,只决定枚举某一项之后是什么都不做还是显示出来还是删除等。

#4


引用 3 楼 纵横车的回复:
可以在QueryKey函数里面加个nFlag参数,说明这个函数是要枚举还是要删除,在函数里面判断nFlag的值来确定RegCloseKey()之前要不要删除它等操作。这样大部分枚举历遍的代码可以重用,只决定枚举某一项之后是什么都不做还是显示出来还是删除等。

我也是这么想的    想了一天了   不知道怎么写呀

#5


//nFlag 0:Enum,1:Delete,
BOOL QueryKey(HKEY RootKey, char *pSubKey, int nFlag)

    HKEY hKey;
    TCHAR lpName[255];           // buffer for subkey name
    DWORD dwIndex, cbName, _dwIndex;        // ,size of name string
    DWORD lpcSubKeys=0;          // number of subkeys 
    BOOL  flag = TRUE;
    if(RegOpenKeyEx(RootKey,pSubKey,0,KEY_READ,&hKey))
flag = FALSE;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL))
flag = FALSE;  
    for (dwIndex=0,_dwIndex=0; dwIndex < lpcSubKeys; dwIndex++)
    {     
        cbName = 255;
        if (!RegEnumKeyEx(hKey, _dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL)) 
        {
            if(!strcmp(lpName,"4") || nFlag==1)
QueryKey(hKey,lpName,1);
else
{
QueryKey(hKey,lpName,0);
_dwIndex++;
}
        }
    }
if(nFlag == 1)
RegDeleteKey(RootKey, pSubKey);
    RegCloseKey(hKey);
    return flag;
}
 
int main(void)
{
    QueryKey(HKEY_CURRENT_USER,"Software\\Tencent",0);
}

#6


请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George

#7




改好了。根据你写的 我整理了下 如下:但是QueryKey(HKEY_CURRENT_USER,"\\Software\\1",0);  那个0 也是删除啊,改成1 又不能用   

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

//nFlag 0:Enum, 1:Delete,
BOOL QueryKey(HKEY RootKey, TCHAR *pSubKey, BOOL nFlag)

    HKEY hKey;
    TCHAR lpName[255];             // buffer for subkey name
    DWORD lpcSubKeys=0, cbName;    // number of subkeys ,size of name string
    BOOL  flag = TRUE;
    if(RegOpenKeyEx(RootKey,pSubKey,0,KEY_READ,&hKey)) flag = FALSE;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL)) flag = FALSE;  
    for (int dwIndex=lpcSubKeys-1; dwIndex >= 0; dwIndex--)
    {     
        cbName = 255;
        RegEnumKeyEx(hKey, dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL);       
if(!strcmp(lpName,"2") || nFlag==1) QueryKey(hKey,lpName,1);
else QueryKey(hKey,lpName,0);       
    }
if(nFlag) RegDeleteKey(RootKey, pSubKey);
    RegCloseKey(hKey);
    return flag;
}
 
int main(void)
{
QueryKey(HKEY_CURRENT_USER,"\\Software\\1",0);  
}

#8


引用 6 楼 zhao4zhong1 的回复:
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George


说的很有道理,我要好好感悟一下。。。
我觉得要是写大点的代码 便于修改维护  我可能不会这样找骨头。
我觉得本来很简单的代码能实现的一小段代码 ,如果写的很繁琐 重复,看上去就觉得不爽,不干净的感觉。。。
总之 我要权衡一下 你说的也很有道理

#9


是参数里写0也把“2”删了?那是这一句的问题。
if(!strcmp(lpName,"2") || nFlag==1)

不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。

#10


引用 9 楼 纵横车的回复:
是参数里写0也把“2”删了?那是这一句的问题。
if(!strcmp(lpName,"2") || nFlag==1)

不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。

是啊  我看你写的  0查询  1删除  我以为是修改      。。。另外   想控制循环,只删除第一次搜索到的  键值   是要用break跳出来吗?

#11


把strcmp(lpName,"2")改为strcmp(lpName,"")就好了,不可能找到空字符串的名字,也就不会删除什么东西了。

#1


上次不是有个删除表项的函数吗?拿过来直接用就好了。

#2


是能直接调用, 可两个函数 重复那么多代码   感觉不简洁   怎么在一个函数里实现呢

#3


可以在QueryKey函数里面加个nFlag参数,说明这个函数是要枚举还是要删除,在函数里面判断nFlag的值来确定RegCloseKey()之前要不要删除它等操作。这样大部分枚举历遍的代码可以重用,只决定枚举某一项之后是什么都不做还是显示出来还是删除等。

#4


引用 3 楼 纵横车的回复:
可以在QueryKey函数里面加个nFlag参数,说明这个函数是要枚举还是要删除,在函数里面判断nFlag的值来确定RegCloseKey()之前要不要删除它等操作。这样大部分枚举历遍的代码可以重用,只决定枚举某一项之后是什么都不做还是显示出来还是删除等。

我也是这么想的    想了一天了   不知道怎么写呀

#5


//nFlag 0:Enum,1:Delete,
BOOL QueryKey(HKEY RootKey, char *pSubKey, int nFlag)

    HKEY hKey;
    TCHAR lpName[255];           // buffer for subkey name
    DWORD dwIndex, cbName, _dwIndex;        // ,size of name string
    DWORD lpcSubKeys=0;          // number of subkeys 
    BOOL  flag = TRUE;
    if(RegOpenKeyEx(RootKey,pSubKey,0,KEY_READ,&hKey))
flag = FALSE;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL))
flag = FALSE;  
    for (dwIndex=0,_dwIndex=0; dwIndex < lpcSubKeys; dwIndex++)
    {     
        cbName = 255;
        if (!RegEnumKeyEx(hKey, _dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL)) 
        {
            if(!strcmp(lpName,"4") || nFlag==1)
QueryKey(hKey,lpName,1);
else
{
QueryKey(hKey,lpName,0);
_dwIndex++;
}
        }
    }
if(nFlag == 1)
RegDeleteKey(RootKey, pSubKey);
    RegCloseKey(hKey);
    return flag;
}
 
int main(void)
{
    QueryKey(HKEY_CURRENT_USER,"Software\\Tencent",0);
}

#6


请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George

#7




改好了。根据你写的 我整理了下 如下:但是QueryKey(HKEY_CURRENT_USER,"\\Software\\1",0);  那个0 也是删除啊,改成1 又不能用   

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

//nFlag 0:Enum, 1:Delete,
BOOL QueryKey(HKEY RootKey, TCHAR *pSubKey, BOOL nFlag)

    HKEY hKey;
    TCHAR lpName[255];             // buffer for subkey name
    DWORD lpcSubKeys=0, cbName;    // number of subkeys ,size of name string
    BOOL  flag = TRUE;
    if(RegOpenKeyEx(RootKey,pSubKey,0,KEY_READ,&hKey)) flag = FALSE;
    if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&lpcSubKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL)) flag = FALSE;  
    for (int dwIndex=lpcSubKeys-1; dwIndex >= 0; dwIndex--)
    {     
        cbName = 255;
        RegEnumKeyEx(hKey, dwIndex, lpName, &cbName, NULL, NULL, NULL, NULL);       
if(!strcmp(lpName,"2") || nFlag==1) QueryKey(hKey,lpName,1);
else QueryKey(hKey,lpName,0);       
    }
if(nFlag) RegDeleteKey(RootKey, pSubKey);
    RegCloseKey(hKey);
    return flag;
}
 
int main(void)
{
QueryKey(HKEY_CURRENT_USER,"\\Software\\1",0);  
}

#8


引用 6 楼 zhao4zhong1 的回复:
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。

意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。

试对比
图书馆(对图书的分类够结构化了吧)

搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。

所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。

结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。

程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George


说的很有道理,我要好好感悟一下。。。
我觉得要是写大点的代码 便于修改维护  我可能不会这样找骨头。
我觉得本来很简单的代码能实现的一小段代码 ,如果写的很繁琐 重复,看上去就觉得不爽,不干净的感觉。。。
总之 我要权衡一下 你说的也很有道理

#9


是参数里写0也把“2”删了?那是这一句的问题。
if(!strcmp(lpName,"2") || nFlag==1)

不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。

#10


引用 9 楼 纵横车的回复:
是参数里写0也把“2”删了?那是这一句的问题。
if(!strcmp(lpName,"2") || nFlag==1)

不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。

是啊  我看你写的  0查询  1删除  我以为是修改      。。。另外   想控制循环,只删除第一次搜索到的  键值   是要用break跳出来吗?

#11


把strcmp(lpName,"2")改为strcmp(lpName,"")就好了,不可能找到空字符串的名字,也就不会删除什么东西了。