c++语言下的删除注册表的问题,技术含量啊
在我的代码里我写了下面的代码,第一次执行exe程序运行成功,并删除了SearchScopes下的子键还创建了479B的这个子键,但是在第二次运行之前我先手动的删除了那个479B的注册表,
再次执行是出现了错误,这个代码会将我的SOFTWARE\\Microsoft\\Internet Explorer\\SearchScopes\\这个主键删除了,
我是想保留这个主键,并将它下面的子键删除。
谁能帮忙看看这里怎么回事?
#include <windows.h>#include <stdio.h>#include <strsafe.h>//*************************************************************//// RegDelnodeRecurse()//// Purpose: Deletes a registry key and all its subkeys / values.//// Parameters: hKeyRoot - Root key// lpSubKey - SubKey to delete//// Return: TRUE if successful.// FALSE if an error occurs.////*************************************************************这是DeleteReglist.hBOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey){ LPTSTR lpEnd; LONG lResult; DWORD dwSize; TCHAR szName[MAX_PATH]; HKEY hKey; FILETIME ftWrite; // First, see if we can delete the key without having // to recurse. lResult = RegDeleteKey(hKeyRoot, lpSubKey); if (lResult == ERROR_NO_MORE_ITEMS) return FALSE;//9.26昨天加的 if (lResult == ERROR_SUCCESS) return TRUE; lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey); if (lResult != ERROR_SUCCESS) { if (lResult == ERROR_FILE_NOT_FOUND) { printf("Key not found.\n"); return TRUE; } else { printf("Error opening key.\n"); return FALSE; } } ///////////////////////////////////////////////////////// // Check for an ending slash and add one if it is missing. lpEnd = lpSubKey + lstrlen(lpSubKey); if (*(lpEnd - 1) != TEXT('\\')) { *lpEnd = TEXT('\\'); lpEnd++; *lpEnd = TEXT('\0'); } // Enumerate the keys 枚举这些键 dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite); //if (lResult == ERROR_NO_MORE_ITEMS) //return FALSE;//9.26昨天加的 if (lResult == ERROR_SUCCESS) { do { StringCchCopy (lpEnd, MAX_PATH*2, szName); if (lResult == ERROR_NO_MORE_ITEMS) return FALSE;//9.26昨天加的 if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) { break; } dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite); if (lResult == ERROR_NO_MORE_ITEMS) return RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);//9.26昨天加的 } while (lResult == ERROR_SUCCESS); } lpEnd--; *lpEnd = TEXT('\0'); if (lResult == ERROR_NO_MORE_ITEMS) return TRUE; //RegCloseKey (hKey); // Try again to delete the key. lResult = RegDeleteKey(hKeyRoot, lpSubKey); if (lResult == ERROR_SUCCESS) return TRUE; return FALSE;}//*************************************************************//// RegDelnode()//// Purpose: Deletes a registry key and all its subkeys / values.//// Parameters: hKeyRoot - Root key// lpSubKey - SubKey to delete//// Return: TRUE if successful.// FALSE if an error occurs.////*************************************************************BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey){ TCHAR szDelKey[MAX_PATH*2]; StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey); return RegDelnodeRecurse(hKeyRoot, szDelKey);}***********************************************************************************************************下面是DeleteReglist.cpp文件************************void __cdecl main(){ BOOL bSuccess; BOOL bSuccess1; bSuccess = RegDelnode(HKEY_CURRENT_USER,TEXT("SOFTWARE\\Microsoft\\Internet Explorer\\SearchScopes\\") /* ||!(TEXT("SOFTWARE\\Microsoft\\Internet Explorer\\SearchScopes\\{7DC0055E-1C76-479B-9C92-9D2459569A1F}")))*/); bSuccess1 =RegDelnode(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\SearchScopes")); if(bSuccess) printf("Success!\n"); else printf("Failure.\n");}*************************************************************************************************这下面是main.cpp文件中调用的BOOL ModifyIESearchEngine( LPCTSTR lpcsURL, LPCTSTR lpcsSearchURL, LPCTSTR lpcsDisplayName ){ HKEY hKEY = NULL; LONG lRet = ::RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Internet Explorer\\SearchScopes\\"), 0, KEY_WRITE, &hKEY); //_TCHAR tcsSearchGUID1[]= _T("{7DC0055E-1C76-479B-9C92-9D2459569A1F}"); // lRet= ::RegSetValueEx(hKEY, _T("DefaultScope"), NULL, REG_SZ, (LPBYTE)tcsSearchGUID1, _tcslen( tcsSearchGUID1 ) * sizeof(TCHAR) ); main();//这个函数是对主键下的子键进行删除的功能 //_tmain(); //下面改的是XP系统中HKEY_CURRENT_USER,这个主键下的SOFTWARE\\Microsoft\\Internet Explorer\\SearchUrl //中添加一个项值是lpcsSearchUrl。 HKEY hNavegakiSearchURLKeyXP = NULL; LONG lRetXP = ::RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Internet Explorer\\SearchUrl"), 0, KEY_WRITE, &hNavegakiSearchURLKeyXP ); if (lRetXP == ERROR_SUCCESS) { lRetXP = ::RegSetValueEx(hNavegakiSearchURLKeyXP, _T("URL"), NULL, REG_SZ,(LPBYTE)lpcsSearchURL ,_tcslen( lpcsSearchURL ) * sizeof(TCHAR) ); } if ( lRet == ERROR_SUCCESS ) { HKEY hNavegakiSearchKey = NULL; _TCHAR tcsSearchGUID[] = _T("{7DC0055E-1C76-479B-9C92-9D2459569A1F}"); lRet = ::RegCreateKey(hKEY, tcsSearchGUID, &hNavegakiSearchKey ); if ( lRet == ERROR_SUCCESS ) { lRet= ::RegSetValueEx(hNavegakiSearchKey, _T("DisplayName"), NULL, REG_SZ, (LPBYTE)lpcsDisplayName, _tcslen( lpcsDisplayName ) * sizeof(TCHAR) ); _TCHAR tcsIconPath[MAX_PATH] = { 0 }; StringCbPrintf( tcsIconPath, MAX_PATH * sizeof(_TCHAR), _T("%s/favicon.ico"), lpcsURL ); lRet= ::RegSetValueEx(hNavegakiSearchKey, _T("FaviconURLFallback"), NULL, REG_SZ, (LPBYTE)tcsIconPath, _tcslen( tcsIconPath ) * sizeof(TCHAR) ); lRet= ::RegSetValueEx(hNavegakiSearchKey, _T("URL"), NULL, REG_SZ, (LPBYTE)lpcsSearchURL, _tcslen( lpcsSearchURL ) * sizeof(TCHAR) ); lRet= ::RegSetValueEx(hKEY, _T("DefaultScope"), NULL, REG_SZ, (LPBYTE)tcsSearchGUID, _tcslen( tcsSearchGUID ) * sizeof(TCHAR) ); return TRUE; } } return FALSE;}