Мониторинг реестра с использованием RegNotifyChangeKeyValue

#c 11 #visual-c #c 17

#c 11 #visual-c #c 17

Вопрос:

Приведенный ниже код предназначен для отслеживания изменений, произошедших в реестре (добавление, удаление, модификация), ожидание выполняется до тех пор, пока не произойдет какое-либо изменение

Теперь ищем вывод, в каком ключе выполняется действие по изменению, изменения в реестре, имя ключа должно быть выводом

 void __cdecl _tmain(int argc, TCHAR *argv[])
{
    DWORD  dwFilter = REG_NOTIFY_CHANGE_NAME |
        REG_NOTIFY_CHANGE_ATTRIBUTES |
        REG_NOTIFY_CHANGE_LAST_SET |
        REG_NOTIFY_CHANGE_SECURITY| REG_NOTIFY_THREAD_AGNOSTIC;

    HANDLE hEvent;
    HKEY   hMainKey;
    HKEY   hKey;
    LONG   lErrorCode;


    RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        TEXT("SOFTWARE\444\1"), 0, KEY_NOTIFY | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_WOW64_64KEY, amp;hKey);


    // Create an event.
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (hEvent == NULL)
    {
        _tprintf(TEXT("Error in CreateEvent (%d).n"), GetLastError());
        return;
    }

    // Watch the registry key for a change of value.
    lErrorCode = RegNotifyChangeKeyValue(hKey,
        TRUE,
        dwFilter,
        hEvent,
        TRUE);
    if (lErrorCode != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Error in RegNotifyChangeKeyValue (%d).n"), lErrorCode);
        return;
    }

    // Wait for an event to occur.
    _tprintf(TEXT("Waiting for a change in the specified key...n"));
    if (WaitForSingleObject(hEvent, INFINITE) == WAIT_FAILED)
    {
        _tprintf(TEXT("Error in WaitForSingleObject (%d).n"), GetLastError());
        return;
    }
    else
    {
        //Get chile events for the event key ... In this case select. Display the key name and values.

        _tprintf(TEXT("nChange has occurred.n"));

        std::cout << hEvent << std::endl;
        _tprintf(TEXT("the modified key is",hEvent));//this was commited

        Sleep(2000);
        return;

    }

    // Close the key.
    lErrorCode = RegCloseKey(hKey);
    if (lErrorCode != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Error in RegCloseKey (%d).n"), GetLastError());
        return;
    }

    // Close the handle.
    if (!CloseHandle(hEvent))
    {
        _tprintf(TEXT("Error in CloseHandle.n"));
        return;
    }
    system("pause");
}
  

Комментарии:

1. Вы не задали вопрос.

2. я хочу напечатать ключ, в котором произошло изменение. Возможно ли это распечатать?

3. Вам придется его искать. (В конце концов, может быть несколько изменений.)