免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > RegDeleteKey无法删除注册表项解决方法

RegDeleteKey无法删除注册表项解决方法

时间:2011-12-21 23:18来源:未知 整理:寂涯网络 点击:

最近在做一个程序的时候,需要删除一项注册表项,这个注册表项包含子项。由于没有这个API编写的经验,所以走了不少弯路,呵呵原谅一个菜鸟在这边大放厥词把。

我最先想到的函数是RegDeleteKey,并觉得一个注册表的删除能难倒我吗?于是直接就用RegCreatKey打开了注册所要要删除的子项所在的项,再用RegDeleteKey删除,可是问题就在这,编译运行都没有任何问题,都是顺利通过的,但是注册表就是没有被删除,于是上论坛提问,等了几天也没人能给出个所以然,回帖的不少,蹭分的也不少,哈哈。无意中看到了一个关于RegDeleteKey的权限问题,我才想到原来这个里面还有API变成常遇到的的问题——权限,这个我遇到过好多次了,就是一直不能吸取教训。好吧,我修改权限,改用RegOpenKeyEx函数,并在参数中赋予打开句柄的KEY_ALL_ACCESS的权限(这个可以自己看MSDN)我想这下一定没有什么问题了吧?编译运行……结果还是一样,这时候就比较郁闷了。论坛上有的朋友让我用GetLastError函数看看出错的原因,我试了一下返回的结果是0,也就是成果运行,又有人说重新启动一下,注册表的修改一般需要重新启动,我又重启了一下,结果依旧,为什么子项没有被删除呢?想了很长时间,我怀疑到函数本身上来——RegDeleteKey。上网看看,才发现网上众说风云,有的说这个函数删除子项和该子项下的所有子项(典型的就是一个名叫API函数大全的玩意),有的说,RegDeleteKey函数不能删除带有子项的注册表项,果然问题在这里。果断上MSDN,MSDN上是这么说的The subkey to be deleted must not have subkeys. To delete a key and all its subkeys, you need to enumerate the subkeys and delete them individually. To delete keys recursively, use the RegDeleteTree or SHDeleteKey function.大意是RegDeleteKey函数不能删除一个含有子项的注册表项,如果想要删除此类的项,必须先枚举再删除。你也可以使用RegDeleteTree或者SHDeleteKey函数。(本人英语不好,大概说一下大意)。到这里才知道原来RegDeleteKey函数不能删除带子项的项,难怪一直没有被删除。而RegDeleteKey函数又只能在VISTA系统以上的平台上编译,我就只能一个个遍历删除了。

于是我又上网回复了自己的帖子,嘿嘿,那个没人能解决的问题。其实我知道,这个简单的问题很多人都知道,就是有点小气,不愿告诉我,开个玩笑。无意间看到一个哥么的问题和我的一样,也没能解决,哈哈,但愿你能看到我的博客。

你看一个多么小的问题,搞的我晕头转向的,其实我们说无论做什么事情都需要细心,从小的方面着手,不能眼高手低,特别是当你还是一个学习中的菜鸟的时候,不能因为事情很小就放弃它,否则当他重要的时候他也会放弃你。

最后愿天下像我一样的菜鸟都能够学习顺利,工作如意。

附:

删除带子项的注册表项(不使用RegDeleteKey函数)

BOOL NosafeModle(void)     

{

    HKEY hKey;

    DWORD count;

    LPTSTR data1=_T("SYSTEM//CurrentControlSet//Control//SafeBoot//Minimal");

    LPTSTR data2=_T("SYSTEM//CurrentControlSet//Control//SafeBoot//Network");

    /*if (RegCreateKey(HKEY_CURRENT_USER,data,&hKey)==ERROR_SUCCESS)

    {

       RegDeleteKey(hKey,_T("Minimal"));

       RegDeleteKey(hKey,_T("Network"));

    }*/

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,data1,0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)

    {

        if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&count,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)

       {

           DWORD dwIndex=0;

            char szName[256]={0};

           for(;dwIndex<count;dwIndex++)

           {

              if(RegEnumKey(hKey,dwIndex,szName,257)==ERROR_SUCCESS)

              {

本页地址 http://www.jybase.net/biancheng/20111221726.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com