最近想想貌似自己的的想法還不少,所以一直在做東西。由於沒有經驗所以進展比較慢,但每次看到自己的成果時都會無比的激動,這種感覺是美妙的,其實熱愛一件事情,你就會感到是你在享受做這件事的過程結果,而不是這件事本身在玩弄你,興趣是學習的動力。好了不吹了進入正題。
最近在做一個程式的時候,需要刪除一項登錄機碼,這個登錄機碼包含子項。由於沒有這個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)