다음을 통해 공유


RegNotifyChangeKeyValue 함수(winreg.h)

호출자에게 지정된 레지스트리 키의 특성 또는 내용에 대한 변경 내용을 알 수 있습니다.

구문

LSTATUS RegNotifyChangeKeyValue(
  [in]           HKEY   hKey,
  [in]           BOOL   bWatchSubtree,
  [in]           DWORD  dwNotifyFilter,
  [in, optional] HANDLE hEvent,
  [in]           BOOL   fAsynchronous
);

매개 변수

[in] hKey

열린 레지스트리 키에 대한 핸들입니다. 이 핸들은 RegCreateKeyEx 또는 RegOpenKeyEx 함수에서 반환됩니다. 미리 정의된 다음 키 중 하나일 수도 있습니다.

HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERS 이 매개 변수는 로컬 핸들이어야 합니다. 원격 핸들을 사용하여 RegNotifyChangeKeyValue를 호출하면 ERROR_INVALID_HANDLE 반환됩니다.

키는 KEY_NOTIFY 액세스 권한으로 열렸어야 합니다. 자세한 내용은 레지스트리 키 보안 및 액세스 권한을 참조하세요.

[in] bWatchSubtree

이 매개 변수가 TRUE이면 함수는 지정된 키와 해당 하위 키의 변경 내용을 보고합니다. 매개 변수가 FALSE이면 함수는 지정된 키에서만 변경 내용을 보고합니다.

[in] dwNotifyFilter

보고해야 하는 변경 내용을 나타내는 값입니다. 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.

의미
REG_NOTIFY_CHANGE_NAME
0x00000001L
하위 키가 추가되거나 삭제되면 호출자에게 알립니다.
REG_NOTIFY_CHANGE_ATTRIBUTES
0x00000002L
보안 설명자 정보와 같은 키의 특성에 대한 변경 내용을 호출자에게 알립니다.
REG_NOTIFY_CHANGE_LAST_SET
0x00000004L
호출자에게 키 값에 대한 변경 내용을 알립니다. 여기에는 값 추가 또는 삭제 또는 기존 값 변경이 포함될 수 있습니다.
REG_NOTIFY_CHANGE_SECURITY
0x00000008L
호출자에게 키의 보안 설명자에 대한 변경 내용을 알립니다.
REG_NOTIFY_THREAD_AGNOSTIC
0x10000000L
등록 수명이 RegNotifyChangeKeyValue 호출을 실행하는 스레드의 수명에 연결되어서는 안 됨을 나타냅니다.
참고 이 플래그 값은 Windows 8 이상에서만 지원됩니다.
 

[in, optional] hEvent

이벤트에 대한 핸들입니다. fAsynchronous 매개 변수가 TRUE이면 함수가 즉시 반환되고 이 이벤트에 신호를 표시하여 변경 내용이 보고됩니다. fAsynchronousFALSE이면 hEvent는 무시됩니다.

[in] fAsynchronous

이 매개 변수가 TRUE이면 함수는 즉시 를 반환하고 지정된 이벤트에 신호를 전송하여 변경 내용을 보고합니다. 이 매개 변수가 FALSE이면 변경이 발생할 때까지 함수가 반환되지 않습니다.

hEvent가 유효한 이벤트를 지정하지 않으면 fAsynchronous 매개 변수는 TRUE일 수 없습니다.

반환 값

함수가 성공하면 반환 값이 ERROR_SUCCESS.

함수가 실패하면 반환 값은 Winerror.h에 정의된 0이 아닌 오류 코드입니다. FormatMessage 함수를 FORMAT_MESSAGE_FROM_SYSTEM 플래그와 함께 사용하여 오류에 대한 일반적인 설명을 가져올 수 있습니다.

설명

이 함수는 단일 변경 사항을 검색합니다. 호출자가 알림 이벤트를 수신한 후 함수를 다시 호출하여 다음 알림을 수신해야 합니다.

참고 Windows NT, Windows 2000 및 Windows XP에서 특정 키 핸들에 대해 RegNotifyChangeKeyValue 를 호출하면 키 핸들이 유효한 한 변경 알림이 계속 발생합니다. 이로 인해 첫 번째 호출과 두 번째 호출 사이의 중간 기간에 변경 내용이 발생한 경우 RegNotifyChangeKeyValue 에 대한 두 번째 호출이 즉시 반환됩니다. API를 비동기적으로 사용하는 경우 중간 변경이 발생한 경우 전달된 이벤트 핸들이 즉시 신호를 받습니다.
 
이 함수는 RegRestoreKey 함수를 사용하여 발생하는 레지스트리의 변경 내용을 검색하는 데 사용할 수 없습니다.

지정된 키를 닫으면 이벤트에 신호가 전송됩니다. 즉, 애플리케이션은 이벤트에 대한 대기 작업에서 반환한 후 열려 있는 키에 의존해서는 안 됩니다.

Windows 8에 도입된 REG_NOTIFY_THREAD_AGNOSTIC 플래그를 사용하면 ThreadPool 스레드에 RegNotifyChangeKeyValue 를 사용할 수 있습니다.

RegNotifyChangeKeyValue라는 스레드가 종료되면 이벤트가 신호를 보냅니다. 키 값의 추가 변경 내용을 계속 모니터링하려면 다른 스레드에서 RegNotifyChangeKeyValue 를 다시 호출합니다.

REG_NOTIFY_THREAD_AGNOSTIC 설정된 RegNotifyChangeKeyValue 호출을 제외하고 이 함수는 영구 스레드에서 호출되어야 합니다. 호출 스레드가 스레드 풀에서 온 것이고 영구적이지 않은 경우 레지스트리 변경이 있을 때뿐만 아니라 스레드가 종료될 때마다 이벤트가 신호를 보냅니다. 정확한 결과를 보장하려면 SetThreadpoolCallbackPersistent 함수를 사용하여 영구 스레드에서 스레드 풀 작업을 실행하거나 CreateThread 함수를 사용하여 사용자 고유의 스레드를 만듭니다. 원래 스레드 풀 API의 경우 QueueUserWorkItem 함수를 사용하여 WT_EXECUTEINPERSISTENTTHREAD 지정합니다.

이 함수는 hKey 값이 같지만 bWatchSubtreedwNotifyFilter 매개 변수에 대해 다른 값을 사용하여 여러 번 호출하면 안 됩니다. 함수는 성공하지만 변경 내용은 무시됩니다. 변경 대상
매개 변수를 watch 먼저 RegCloseKey를 호출하여 키 핸들을 닫고, RegOpenKeyEx를 호출하여 키 핸들을 다시 연 다음, 새 매개 변수를 사용하여 RegNotifyChangeKeyValue를 호출해야 합니다.

프로세스가 동일한 매개 변수 집합을 사용하여 RegNotifyChangeKeyValue 를 호출할 때마다 다른 대기 작업을 설정하여 리소스 누수를 만듭니다. 따라서 이전 대기 작업이 완료될 때까지 동일한 매개 변수를 사용하여 RegNotifyChangeKeyValue를 호출하지 않는 검사.

레지스트리 작업을 자세히 모니터링하려면 레지스트리를 참조 하세요.

Windows XP/2000: 특정 키 핸들에 대해 RegNotifyChangeKeyValue 가 호출되면 키 핸들이 유효한 한 변경 알림이 발생합니다. 이로 인해 RegNotifyChangeKeyValue 에 대한 두 번째 호출이 첫 번째 호출과 두 번째 호출 사이에 중간에 변경이 발생하는 경우 즉시 반환됩니다. 함수를 비동기적으로 사용하는 경우 중간에 변경이 발생하면 전달된 이벤트 핸들이 즉시 신호를 받습니다.

예제

다음 프로그램에서는 RegNotifyChangeKeyValue를 사용하는 방법을 보여 줍니다.

#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;
   }
}

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 winreg.h(Windows.h 포함)
라이브러리 Advapi32.lib
DLL Advapi32.dll

추가 정보

RegCloseKey

RegDeleteKey

RegEnumKeyEx

RegEnumValue

RegQueryInfoKey

RegQueryValueEx

레지스트리 함수