Удалить ключ и подключ из реестра: Код выбрасывает необработанное исключение

Я хочу удалить ключ реестра и все подразделы. Я использую код из Вот.

Код компилируется нормально, но при отладке кода

"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');
}

0

Решение

Я написал код для рекурсивного удаления ключа реестра и его подразделов некоторое время назад. Код выглядит так:

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.

РЕДАКТИРОВАТЬ:: Если вы не хотите рекурсивно удалять все дерево, для этого у MSDN есть две функции. Вы всегда можете использовать их, а именно, RegDeleteTree а также SHDeleteKey.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]