Конференция "WinAPI" » Как отследить изменения в определенной ветке реестра? [D7, Win2k, WinXP]
 
  • apic (07.06.10 10:48) [0]
    Как отследить изменения в определенной ветке реестра? Внешнии компоненты не предлагать и не говорить, что есть много готовых программ, готовые программы мне не нужны. Заранее спасибо! Очень буду благодарен за пример исходного кода.
  • Игорь Шевченко © (07.06.10 12:38) [1]
    RegNotifyChangeKeyValue
  • apic (07.06.10 15:05) [2]
    Я знаю, что RegNotifyChangeKeyValue, а как все это реализовать?
  • MBo © (07.06.10 15:14) [3]
    а разве MSDN не поможет?
  • Anatoly Podgoretsky © (07.06.10 15:15) [4]
    > apic  (07.06.2010 15:05:02)  [2]

    Ну я бы для начала попробывал посмотреть в справке, и потом бы задал
    конкретный вопрос.
    В справке хорошо описаны параметры функции.
  • Игорь Шевченко © (07.06.10 16:37) [5]

    > а как все это реализовать?


    программу написать
  • DVM © (07.06.10 20:56) [6]

    > apic

    Тут http://wasm.ru/baixado.php?mode=tool&id=283 исходники старой версии RegMon Руссиновича. Бери, ковыряй.
  • apic (08.06.10 10:56) [7]
    DVM, спасибо хоть за это!
  • apic (09.06.10 05:57) [8]
    Короче вот этот исходник с МСДН во всей сети и вжурналя хакер и во всей других периодических изданиях:
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>

    //void main(int argc, char *argv[])
    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;

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

      // Display the usage error message.
      if (argc != 3)
      {
         _tprintf(TEXT("Usage: notify [HKLM|HKU|HKCU|HKCR|HCC] [<subkey>]\n"));
         return;
      }

      // Convert parameters to appropriate handles.
      if (_tcscmp(TEXT("HKLM"), argv[1]) == 0) hMainKey=HKEY_LOCAL_MACHINE;
      else if(_tcscmp(TEXT("HKU"), argv[1]) == 0) hMainKey=HKEY_USERS;
      else if(_tcscmp(TEXT("HKCU"), argv[1]) == 0) hMainKey=HKEY_CURRENT_USER;
      else if(_tcscmp(TEXT("HKCR"), argv[1]) == 0) hMainKey=HKEY_CLASSES_ROOT;
      else if(_tcscmp(TEXT("HCC"), argv[1]) == 0) hMainKey=HKEY_CURRENT_CONFIG;
      else
      {
         _tprintf(TEXT("Usage: notify [HKLM|HKU|HKCU|HKCR|HCC] [<subkey>]\n"));
         return;
      }

      // Open a key.
       lErrorCode = RegOpenKeyEx(hMainKey, argv[2], 0, KEY_NOTIFY, &hKey);
      if (lErrorCode != ERROR_SUCCESS)
      {
         _tprintf(TEXT("Error in RegOpenKeyEx (%d).\n"), lErrorCode);
         return;
      }

      // 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 _tprintf(TEXT("\nChange has occurred.\n"));

      // 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;
      }
    }
    Но он меня БЕСИТ!!! Ну переделал я его на Делфи и чЁЁЁЁЁЁЁЁ?
    Все это дело нужно во первых запускать в отдельном потоке, а во вторых как это все б...я, остановить, может я хочу прекратить следить за реестром, или сменить ветку слежения. Пытаюсь завершить поток, у меня тупо звисает главня форма приложения, а эта скотина всеравно продолжает следить за изменениями, это что впринципе не решимая задача, что ли?
  • MBo © (09.06.10 06:15) [9]
    >Но он меня БЕСИТ!!!
    А ведь пора начать думать. Поток ждет на функции бесконечного ожидания.
    Таймаут ей назначить или заменить на WaitForMultipleObjects
  • apic (09.06.10 10:18) [10]
    MBo спасиб, попробую! Я например вообще не знал о существовании WaitForMultipleObjects, да и как ими правильно пользываться я без понятия, где же в наше время найдешь нормальное описание API на русском?
  • Игорь Шевченко © (09.06.10 10:59) [11]
    apic   (09.06.10 10:18) [10]

    Учи английский, заплати переводчику, в чем проблема ?
 
Конференция "WinAPI" » Как отследить изменения в определенной ветке реестра? [D7, Win2k, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0]