首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++语言上的删除注册表的有关问题,技术含量

2012-11-01 
c++语言下的删除注册表的问题,技术含量啊在我的代码里我写了下面的代码,第一次执行exe程序运行成功,并删除

c++语言下的删除注册表的问题,技术含量啊
在我的代码里我写了下面的代码,第一次执行exe程序运行成功,并删除了SearchScopes下的子键还创建了479B的这个子键,但是在第二次运行之前我先手动的删除了那个479B的注册表,
再次执行是出现了错误,这个代码会将我的SOFTWARE\\Microsoft\\Internet Explorer\\SearchScopes\\这个主键删除了,
我是想保留这个主键,并将它下面的子键删除。
谁能帮忙看看这里怎么回事?

C/C++ code
#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;} 



坐等,大神的指导。

[解决办法]
建议借助regmon软件调试
[解决办法]
果断去试下
[解决办法]
注册表是其它优秀系统都不采用的东东!

热点排行