0

レジストリ キーとすべてのサブキーを削除したいのですが、こちらのコードを使用しています。

コードは正常にコンパイルされますが、コードをデバッグするとき

"Unhandled exception at 0x00416d14 in deletedemo.exe: 0xC0000005: Access violation writing location 0x0041ff01."

行で例外が発生する

// Check for an ending slash and add one if it is missing.

    lpEnd = lpSubKey + lstrlen(lpSubKey);

    if (*(lpEnd - 1) != TEXT('\\')) 
    {
        *lpEnd =  TEXT('\\'); //Here exception occur.
        lpEnd++;
        *lpEnd =  TEXT('\0');
    }
4

1 に答える 1

1

少し前に、レジストリ キーとそのサブキーを再帰的に削除するコードを作成しました。コードは次のようになります::

static BOOL RcrsvRegDel( HKEY hKey, LPTSTR lpszSub, DWORD dwOpenFlags )
{
BOOL    bRet = TRUE ;
LONG    lRet ;
DWORD   dwSize = MAX_PATH ;
TCHAR   szName[MAX_PATH] ;
HKEY    hKeySub = NULL ;
HRESULT hr = NULL ;
HANDLE  hProcess = NULL ;
HANDLE  hToken = NULL ;

do{
    lRet = RegOpenKeyEx( hKey, lpszSub, 0, dwOpenFlags, &hKeySub ) ;
    if( lRet != ERROR_SUCCESS )
    {
        bRet = FALSE ;
        break ;
    }

    while( ERROR_NO_MORE_ITEMS != (lRet = RegEnumKeyEx(hKeySub, 0, szName, &dwSize, NULL, 
        NULL, NULL, NULL)) )
        if( !RcrsvRegDel(hKeySub, szName, dwOpenFlags) ) 
        {
            bRet = FALSE ;
            break ;
        }

    lRet = RegDeleteKey( hKey, lpszSub ) ;
    printf("RegDelKey:: %S :: lRet = %ld\n", lpszSub, lRet) ;
    if( lRet != ERROR_SUCCESS )
    {
        bRet = FALSE ;
        break ;
    }

    if( hKeySub != NULL )
    {
        RegCloseKey(hKeySub) ;
        hKeySub = NULL ;
    }
}while(0) ;
return bRet ;
}

dwOpenFlags = RegOpenKeyEx または RegDeleteKey に渡されるフラグ。

EDIT :: ツリー全体を再帰的に削除したくない場合、MSDN にはこれを行うための 2 つの機能があります。それら、つまりRegDeleteTreeSHDeleteKeyはいつでも使用できます。

于 2012-10-15T07:04:59.247 に答える