使用C ++进行更改的Windows注册表监视

时间:2015-01-16 06:20:03

标签: c++ windows registry

我有以下代码正在执行以下步骤:

  1. 使用RegOpenKeyEx
  2. 打开RegistryKey
  3. 打开密钥后,使用CreateEvent创建活动。
  4. 使用RegNotifyChangeKeyValue获取通知。
  5. 上述步骤仅向我发出更改通知,但不提供有关更改发生位置的信息。例如,考虑以下代码:

    #include <Windows.h>
    #include <iostream>
    #include <string>
    
    int main()
    {
        DWORD  dwFilter = REG_NOTIFY_CHANGE_NAME|
                         REG_NOTIFY_CHANGE_ATTRIBUTES |
                         REG_NOTIFY_CHANGE_LAST_SET |
                         REG_NOTIFY_CHANGE_SECURITY;
    
        HKEY pHresult=0;
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\aaaa",0,KEY_NOTIFY|KEY_CREATE_SUB_KEY|KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE|KEY_WOW64_64KEY,&pHresult)!=ERROR_SUCCESS){
            std::cout << "FAIL IN OPEN SOFTWARE" << std::endl;
        }
        std::cout << " OPEN software//aaaa" << std::endl;
    
        while(1)
        {   
            HANDLE hevent = CreateEvent(NULL,FALSE, TRUE, NULL);
            if(RegNotifyChangeKeyValue(pHresult,TRUE,dwFilter,hevent,TRUE) != ERROR_SUCCESS)
            {
                std::cout << "NOTIFICATION FAILED " << std::endl;
            }
    
            DWORD dwret = WaitForSingleObject(hevent, 2000);    
            if(dwret == WAIT_TIMEOUT)
            {
                std::cout << " TIMEOUT " << std::endl;
            }
            else if (dwret == WAIT_FAILED)
            {
                //
            }
            else
            {
                std::cout << "Change Occured" << std::endl;
            }
    
            //Sleep(2000);
        }
        RegCloseKey(pHresult);
    }
    

    在上面的代码中,如果在aaaa中进行了更改,则会获得Change Occured。如何获取发生更改的位置。一种方法是使用递归并扫描整个路径。有没有更好的方法或API来减少递归方式的开销?

0 个答案:

没有答案