关于RegDeleteKey无法删除注册表项

时间:2022-03-28 20:30:06

最近想想貌似自己的的想法还不少,所以一直在做东西。由于没有经验所以进展比较慢,但每次看到自己的成果时都会无比的激动,这种感觉是美妙的,其实热爱一件事情,你就会感到是你在享受做这件事的过程结果,而不是这件事本身在玩弄你,兴趣是学习的动力。好了不吹了进入正题。

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

我最先想到的函数是RegDeleteKey,并觉得一个注册表的删除能难倒我吗?于是直接就用RegCreatKey打开了注册所要要删除的子项所在的项,再用RegDeleteKey删除,可是问题就在这,编译运行都没有任何问题,都是顺利通过的,但是注册表就是没有被删除,于是上论坛提问,等了几天也没人能给出个所以然,回帖的不少,蹭分的也不少,哈哈。无意中看到了一个关于RegDeleteKey的权限问题,我才想到原来这个里面还有API变成常遇到的的问题——权限,这个我遇到过好多次了,就是一直不能吸取教训。好吧,我修改权限,改用RegOpenKeyEx函数,并在参数中赋予打开句柄的KEY_ALL_ACCESS的权限(这个可以自己看MSDN)我想这下一定没有什么问题了吧?编译运行……结果还是一样,这时候就比较郁闷了。论坛上有的朋友让我用GetLastError函数看看出错的原因,我试了一下返回的结果是0,也就是成果运行,又有人说重新启动一下,注册表的修改一般需要重新启动,我又重启了一下,结果依旧,为什么子项没有被删除呢?想了很长时间,我怀疑到函数本身上来——RegDeleteKey。上网看看,才发现网上众说风云,有的说这个函数删除子项和该子项下的所有子项(典型的就是一个名叫API函数大全的玩意),有的说,RegDeleteKey函数不能删除带有子项的注册表项,果然问题在这里。果断上MSDNMSDN上是这么说的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)

              {

                  RegDeleteKey(hKey,(const char *)szName);

              }

           }

       }

    }

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