Pernyataan: Setiap kelompok atau individu selain CSDN yang mencetak ulang artikel ini harus menyebutkan sumber dan penulisnya.
Kelas TRegistry yang disertakan dengan Delphi hanya dapat mengimplementasikan operasi dasar registri. Jika kita ingin memantau perubahan dalam registri secara real time atau memindai semua subkunci di bawah kunci tertentu dalam registri, kelas TRegistry tidak berdaya. Saya menggerogoti SDK untuk waktu yang lama, dan akhirnya menyadari pemantauan dan pemindaian Delphi terhadap registri. Saya tidak berani menyimpannya sendiri, jadi saya mendedikasikannya untuk sebagian besar penggemar Delphi.
Memantau perubahan pada item terkait registri memerlukan API: RegNotifyChangeKeyValue.
RegNotifyChangeKeyValue PANJANG(
HKEY hKey, // menangani item yang akan dipantau
BOOL bWatchSubtree, // Apakah akan memantau subkunci item ini
DWord dwNotifyFilter, // Perubahan apa yang harus dipantau
HANDLE hEvent, // Menangani objek event yang menerima event perubahan registri
BOOL fasynchronous // Laporkan sebelum perubahan registri atau setelah perubahan registri
);
Perhatikan bahwa hEvent di atas adalah pengendali objek peristiwa yang menerima peristiwa perubahan registri. Kita perlu menggunakan API: CreateEvent untuk membuat objek peristiwa sistem.
TANGANI Buat Acara(
LPSECURITY_ATTRIBUTES lpEventAttributes, // struktur SECURITY_ATTRIBUTES
BOOL bManualReset, // Apakah akan mereset secara otomatis
BOOL bInitialState, // Apakah akan menyetel status awal
LPCTSTR lpName //Nama objek acara
);
Buat proyek baru dan tambahkan ListBox dan dua Tombol.
//Pertama tulis contoh monitoring registry
//Pantau semua subkunci di bawah item HKEY_CURRENT_USER/Software
Prosedur TForm1.Button1Click(Pengirim: TObject);
var
hBeri tahu: Pegangan;
hKeyx:HKEY;
dwRes: DWORD;
mulai
hNotify := CreateEvent( nil, //Jangan gunakan struktur SECURITY_ATTRIBUTES
FALSE, //Jangan direset secara otomatis
BENAR, //Menetapkan keadaan awal
'RegistryNotify' //Nama objek acara
);
jika hNotify = 0 maka
mulai
Showmessage('CreateEvent gagal.');
KELUAR;
akhir;
if RegOpenKeyEx(HKEY_CURRENT_USER, //Ikuti kuncinya
'Perangkat Lunak', //Subkunci
0, // dicadangkan
KEY_NOTIFY, //untuk pemantauan
hKeyx //Simpan pegangan
) <> ERROR_SUCCESS lalu
mulai
CloseHandle( hNotify );
Showmessage('RegOpenKeyEx gagal.');
KELUAR;
akhir;
if RegNotifyChangeKeyValue( hKeyx, //Pantau pegangan subkunci
TRUE, //Pantau subkunci item ini
REG_NOTIFY_CHANGE_NAME atau REG_NOTIFY_CHANGE_LAST_SET,
hNotify, //Pegangan objek peristiwa yang menerima peristiwa perubahan registri
BENAR //Laporkan sebelum perubahan registri
) <> ERROR_SUCCESS lalu
mulai
CloseHandle( hNotify );
RegCloseKey( hKeyx );
Showmessage('RegNotifyChangeKeyValue gagal');
KELUAR;
akhir;
dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //Pantau selama satu menit
jika dwRes = 0 maka
Showmessage('Registry akan diubah.' );
CloseHandle( hNotify );
RegCloseKey( hKeyx );
akhir;
Perlu dicatat bahwa API: WaitForSingleObject tidak akan kembali sampai peristiwa perubahan registri terjadi atau waktu habis. Solusinya adalah dengan membuat thread baru dan memantau registry di thread baru tersebut.
Dua API lain digunakan untuk memindai registri: RegEnumKey dan RegEnumValue.
Kunci RegEnum PANJANG(
HKEY hKey, // menangani item registri yang akan dipindai
DWORD dwIndex,//nomor seri subkunci yang akan dipindai
LPTSTR lpName,//Nama subkunci yang akan dipindai
LPDWORD lpcbName, // Nama subkunci yang akan dipindai menempati ruang
);
Cara menggunakan fungsi ini adalah: pertama tetapkan 0 ke dwIndex, panggil RegEnumKey; lalu Inc(dwIndex), lalu panggil RegEnumKey hingga nilai yang dikembalikan adalah ERROR_NO_MORE_ITEMS, yang menunjukkan bahwa tidak ada lagi sub-item.
//Contoh pemindaian registri
//Hanya mendemonstrasikan cara menghitung satu tingkat sub-item di bawah HKEY_CURRENT_USER/Software
prosedur TForm1.Button2Click(Pengirim: TObject);
var
buf : array [0..255] dari char;
iRes : bilangan bulat;
hKeyx:HKEY;
dwIndex, dwUkuran: DWORD;
mulai
jika RegOpenKeyEx( HKEY_CURRENT_USER, 'Perangkat Lunak', 0, KEY_READ atau
KEY_ENUMERATE_SUB_KEYS, hKeyx ) <> ERROR_SUCCESS lalu
mulai
Showmessage('RegOpenKeyEx gagal.');
KELUAR;
akhir;
indeks dw := 0;
mengulang
ukuran dw := 255;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
jika iRes = ERROR_NO_MORE_ITEMS maka
merusak
lain jika iRes = ERROR_SUCCESS maka
mulai
Kotak Daftar1.Item.Tambahkan(buf);
Inc(dwIndeks);
akhir;
sampai iRes <> ERROR_SUCCESS;
RegCloseKey( hKeyx );
akhir;