Удалить ключ реестра рекурсивно - PullRequest
2 голосов
/ 18 мая 2009

Мне нужно удалить поддерево в реестре Windows под Windows Mobile 6. Функция RegDeleteTree недоступна, а SHDeleteKey (по-видимому) недоступен в любой статической библиотеке в WM6 SDK, хотя объявление доступно в shlwapi. ч.
Я пытался получить его из shlwapi.dll, как

    typedef DWORD (__stdcall *SHDeleteKey_Proc) (HKEY, LPCWSTR);
    SHDeleteKey_Proc procSHDeleteKey; 
    HINSTANCE shlwapidll = ::LoadLibrary(_T("shlwapi.dll"));
    if(shlwapidll) {
    procSHDeleteKey = 
            (SHDeleteKey_Proc)GetProcAddress(shlwapidll,_T("SHDeleteKeyW"));
        ASSERT(procSHDeleteKey);
    }

Но я попал в утверждение.
Есть ли хороший способ рекурсивно удалить ключ реестра (пустой или нет) в Windows Mobile?

Ответы [ 3 ]

6 голосов
/ 18 мая 2009

Наверное, я сам нашел ответ в MSDN . Меня удивляет, что функциональность недоступна через SDK, хотя ...
Я поместил здесь код из MSDN, просто для записи:

//*************************************************************
//
//  RegDelnodeRecurse()
//
//  Purpose:    Deletes a registry key and all it's subkeys / values.
//
//  Parameters: hKeyRoot    -   Root key
//              lpSubKey    -   SubKey to delete
//
//  Return:     TRUE if successful.
//              FALSE if an error occurs.
//
//*************************************************************

BOOL 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_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_SUCCESS) 
    {
        do {

            StringCchCopy (lpEnd, MAX_PATH*2, szName);

            if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
                break;
            }

            dwSize = MAX_PATH;

            lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                                   NULL, NULL, &ftWrite);

        } while (lResult == ERROR_SUCCESS);
    }

    lpEnd--;
    *lpEnd = TEXT('\0');

    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 it's 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);
}
0 голосов
/ 28 августа 2009

Вы ищете функцию RegDeleteTree (). Просто замените RegDeleteKey на него.

Очевидно, им потребовалось некоторое время, чтобы понять это, поэтому, если вы хотите поддерживать XP или более раннюю версию, вам нужно иметь собственную реализацию этого.

0 голосов
/ 18 мая 2009

Второй аргумент GetProcAddress - это LPCSTR (то есть , а не a LPCTSTR). Так что удалите _T() и попробуйте это:

GetProcAddress(shlwapidll, "SHDeleteKeyW");

Помогает ли это решить проблему?

...