關於RegDeleteKey無法刪除登錄機碼

來源:互聯網
上載者:User

最近想想貌似自己的的想法還不少,所以一直在做東西。由於沒有經驗所以進展比較慢,但每次看到自己的成果時都會無比的激動,這種感覺是美妙的,其實熱愛一件事情,你就會感到是你在享受做這件事的過程結果,而不是這件事本身在玩弄你,興趣是學習的動力。好了不吹了進入正題。

最近在做一個程式的時候,需要刪除一項登錄機碼,這個登錄機碼包含子項。由於沒有這個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)

              {

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

              }

           }

       }

    }

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.