-
Как отследить изменения в определенной ветке реестра? Внешнии компоненты не предлагать и не говорить, что есть много готовых программ, готовые программы мне не нужны. Заранее спасибо! Очень буду благодарен за пример исходного кода.
-
RegNotifyChangeKeyValue
-
Я знаю, что RegNotifyChangeKeyValue, а как все это реализовать?
-
а разве MSDN не поможет?
-
> apic (07.06.2010 15:05:02) [2]
Ну я бы для начала попробывал посмотреть в справке, и потом бы задал конкретный вопрос. В справке хорошо описаны параметры функции.
-
> а как все это реализовать?
программу написать
-
-
DVM, спасибо хоть за это!
-
Короче вот этот исходник с МСДН во всей сети и вжурналя хакер и во всей других периодических изданиях: #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; } } Но он меня БЕСИТ!!! Ну переделал я его на Делфи и чЁЁЁЁЁЁЁЁ? Все это дело нужно во первых запускать в отдельном потоке, а во вторых как это все б...я, остановить, может я хочу прекратить следить за реестром, или сменить ветку слежения. Пытаюсь завершить поток, у меня тупо звисает главня форма приложения, а эта скотина всеравно продолжает следить за изменениями, это что впринципе не решимая задача, что ли?
-
>Но он меня БЕСИТ!!! А ведь пора начать думать. Поток ждет на функции бесконечного ожидания. Таймаут ей назначить или заменить на WaitForMultipleObjects
-
MBo спасиб, попробую! Я например вообще не знал о существовании WaitForMultipleObjects, да и как ими правильно пользываться я без понятия, где же в наше время найдешь нормальное описание API на русском?
-
apic (09.06.10 10:18) [10]
Учи английский, заплати переводчику, в чем проблема ?
|