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
보고해야 하는 변경 내용을 나타내는 값입니다. 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.
[in, optional] hEvent
이벤트에 대한 핸들입니다. fAsynchronous 매개 변수가 TRUE이면 함수가 즉시 반환되고 이 이벤트에 신호를 표시하여 변경 내용이 보고됩니다. fAsynchronous가 FALSE이면 hEvent는 무시됩니다.
[in] fAsynchronous
이 매개 변수가 TRUE이면 함수는 즉시 를 반환하고 지정된 이벤트에 신호를 전송하여 변경 내용을 보고합니다. 이 매개 변수가 FALSE이면 변경이 발생할 때까지 함수가 반환되지 않습니다.
hEvent가 유효한 이벤트를 지정하지 않으면 fAsynchronous 매개 변수는 TRUE일 수 없습니다.
반환 값
함수가 성공하면 반환 값이 ERROR_SUCCESS.
함수가 실패하면 반환 값은 Winerror.h에 정의된 0이 아닌 오류 코드입니다. FormatMessage 함수를 FORMAT_MESSAGE_FROM_SYSTEM 플래그와 함께 사용하여 오류에 대한 일반적인 설명을 가져올 수 있습니다.
설명
이 함수는 단일 변경 사항을 검색합니다. 호출자가 알림 이벤트를 수신한 후 함수를 다시 호출하여 다음 알림을 수신해야 합니다.
지정된 키를 닫으면 이벤트에 신호가 전송됩니다. 즉, 애플리케이션은 이벤트에 대한 대기 작업에서 반환한 후 열려 있는 키에 의존해서는 안 됩니다.
Windows 8에 도입된 REG_NOTIFY_THREAD_AGNOSTIC 플래그를 사용하면 ThreadPool 스레드에 RegNotifyChangeKeyValue 를 사용할 수 있습니다.
RegNotifyChangeKeyValue라는 스레드가 종료되면 이벤트가 신호를 보냅니다. 키 값의 추가 변경 내용을 계속 모니터링하려면 다른 스레드에서 RegNotifyChangeKeyValue 를 다시 호출합니다.
REG_NOTIFY_THREAD_AGNOSTIC 설정된 RegNotifyChangeKeyValue 호출을 제외하고 이 함수는 영구 스레드에서 호출되어야 합니다. 호출 스레드가 스레드 풀에서 온 것이고 영구적이지 않은 경우 레지스트리 변경이 있을 때뿐만 아니라 스레드가 종료될 때마다 이벤트가 신호를 보냅니다. 정확한 결과를 보장하려면 SetThreadpoolCallbackPersistent 함수를 사용하여 영구 스레드에서 스레드 풀 작업을 실행하거나 CreateThread 함수를 사용하여 사용자 고유의 스레드를 만듭니다. 원래 스레드 풀 API의 경우 QueueUserWorkItem 함수를 사용하여 WT_EXECUTEINPERSISTENTTHREAD 지정합니다.
이 함수는 hKey 값이 같지만 bWatchSubtree 및 dwNotifyFilter 매개 변수에 대해 다른 값을 사용하여 여러 번 호출하면 안 됩니다. 함수는 성공하지만 변경 내용은 무시됩니다. 변경 대상
매개 변수를 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 |