#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
我也是这么想的 想了一天了 不知道怎么写呀
#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
意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。
试对比
图书馆(对图书的分类够结构化了吧)
和
搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。
所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习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
说的很有道理,我要好好感悟一下。。。
我觉得要是写大点的代码 便于修改维护 我可能不会这样找骨头。
我觉得本来很简单的代码能实现的一小段代码 ,如果写的很繁琐 重复,看上去就觉得不爽,不干净的感觉。。。
总之 我要权衡一下 你说的也很有道理
#9
是参数里写0也把“2”删了?那是这一句的问题。
不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。
if(!strcmp(lpName,"2") || nFlag==1)
不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。
#10
是啊 我看你写的 0查询 1删除 我以为是修改 。。。另外 想控制循环,只删除第一次搜索到的 键值 是要用break跳出来吗?
#11
把strcmp(lpName,"2")改为strcmp(lpName,"")就好了,不可能找到空字符串的名字,也就不会删除什么东西了。
#1
上次不是有个删除表项的函数吗?拿过来直接用就好了。
#2
是能直接调用, 可两个函数 重复那么多代码 感觉不简洁 怎么在一个函数里实现呢
#3
可以在QueryKey函数里面加个nFlag参数,说明这个函数是要枚举还是要删除,在函数里面判断nFlag的值来确定RegCloseKey()之前要不要删除它等操作。这样大部分枚举历遍的代码可以重用,只决定枚举某一项之后是什么都不做还是显示出来还是删除等。
#4
我也是这么想的 想了一天了 不知道怎么写呀
#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
意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。
试对比
图书馆(对图书的分类够结构化了吧)
和
搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。
所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习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
说的很有道理,我要好好感悟一下。。。
我觉得要是写大点的代码 便于修改维护 我可能不会这样找骨头。
我觉得本来很简单的代码能实现的一小段代码 ,如果写的很繁琐 重复,看上去就觉得不爽,不干净的感觉。。。
总之 我要权衡一下 你说的也很有道理
#9
是参数里写0也把“2”删了?那是这一句的问题。
不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。
if(!strcmp(lpName,"2") || nFlag==1)
不过你要的不就是这样的功能吗?先历遍,找到要删的就把它删了。
#10
是啊 我看你写的 0查询 1删除 我以为是修改 。。。另外 想控制循环,只删除第一次搜索到的 键值 是要用break跳出来吗?
#11
把strcmp(lpName,"2")改为strcmp(lpName,"")就好了,不可能找到空字符串的名字,也就不会删除什么东西了。