Declaración: Cualquier grupo o individuo que no sea CSDN que reimprima este artículo debe indicar la fuente y el autor.
La clase TRegistry que viene con Delphi solo puede implementar las operaciones básicas del registro. Si queremos monitorear los cambios en el registro en tiempo real o escanear todas las subclaves bajo una clave específica en el registro, la clase TRegistry no tiene poder. Mordí el SDK durante mucho tiempo y finalmente me di cuenta de que Delphi monitoreaba y escaneaba el registro. No me atrevía a guardármelo para mí, así que se lo dediqué a la mayoría de los entusiastas de Delphi.
La supervisión de cambios en elementos relacionados con el registro requiere una API: RegNotifyChangeKeyValue.
LARGO RegNotifyChangeKeyValue(
HKEY hKey, // maneja un elemento a monitorear
BOOL bWatchSubtree, // Si se deben monitorear las subclaves de este elemento
DWord dwNotifyFilter, // Qué cambios monitorear
HANDLE hEvent, // identificador de objeto de evento que acepta eventos de cambio de registro
BOOL fAsynchronous // Informe antes de cambios en el registro o después de cambios en el registro
);
Tenga en cuenta que el hEvent anterior es el identificador del objeto de evento que acepta eventos de cambio de registro. Necesitamos usar API: CreateEvent para crear un objeto de evento del sistema.
MANEJAR CrearEvento(
LPSECURITY_ATTRIBUTES lpEventAttributes, // estructura SECURITY_ATTRIBUTES
BOOL bManualReset, // Si se debe restablecer automáticamente
BOOL bInitialState, // Si se establece el estado inicial
LPCTSTR lpName //El nombre del objeto del evento
);
Cree un nuevo proyecto y agregue un ListBox y dos botones.
// Primero escribe un ejemplo de monitoreo del registro.
//Monitorear todas las subclaves bajo el elemento HKEY_CURRENT_USER/Software
Procedimiento TForm1.Button1Click(Remitente: TObject);
var
hNotificar: THandle;
hKeyx:HKEY;
dwRes: DWORD;
comenzar
hNotify := CreateEvent( nil, //No usar la estructura SECURITY_ATTRIBUTES
FALSO, //No restablecer automáticamente
VERDADERO, //Establece el estado inicial
'RegistryNotify' //El nombre del objeto del evento
);
si hNotificar = 0 entonces
comenzar
Showmessage('Error al crear evento.');
salida;
fin;
if RegOpenKeyEx(HKEY_CURRENT_USER, //Sigue la clave
'Software', //Subclave
0, //reservado
KEY_NOTIFY, //para monitoreo
hKeyx //Guardar identificador
) <> ERROR_SUCCESS entonces
comenzar
CloseHandle(hNotificar);
Showmessage('Error en RegOpenKeyEx.');
salida;
fin;
if RegNotifyChangeKeyValue( hKeyx, //Monitorear identificador de subclave
TRUE, //Monitorea las subclaves de este elemento
REG_NOTIFY_CHANGE_NAME o REG_NOTIFY_CHANGE_LAST_SET,
hNotify, // identificador del objeto de evento que acepta eventos de cambio de registro
VERDADERO //Informe antes de cambios en el registro
) <> ERROR_SUCCESS entonces
comenzar
CloseHandle(hNotificar);
RegCloseKey( hKeyx );
Showmessage('Error en RegNotifyChangeKeyValue');
salida;
fin;
dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //Monitorear durante un minuto;
si dwRes = 0 entonces
Showmessage('Se cambiará el registro.');
CloseHandle(hNotificar);
RegCloseKey( hKeyx );
fin;
Cabe señalar que API: WaitForSingleObject no regresará hasta que ocurra el evento de cambio de registro o se agote el tiempo de espera. Durante este período, nuestro programa perderá respuesta. La solución es crear un nuevo hilo y monitorear el registro en el nuevo hilo.
Se utilizan otras dos API para escanear el registro: RegEnumKey y RegEnumValue.
LONG RegEnumKey(
HKEY hKey, // identificador del elemento de registro que se va a escanear
DWORD dwIndex, // número de serie de la subclave que se escaneará
LPTSTR lpName,//El nombre de la subclave que se escaneará
LPDWORD lpcbName, // El nombre de la subclave a escanear ocupa espacio
);
El método para usar esta función es: primero asigne 0 a dwIndex, llame a RegEnumKey; luego Inc (dwIndex) y luego llame a RegEnumKey hasta que el valor de retorno sea ERROR_NO_MORE_ITEMS, lo que indica que no hay más subelementos.
//Ejemplo de escaneo del registro
//Solo demuestra cómo enumerar un nivel de subelementos en HKEY_CURRENT_USER/Software
procedimiento TForm1.Button2Click (Remitente: TObject);
var
buf: matriz [0..255] de char;
iRes: número entero;
hKeyx:HKEY;
dwIndex, dwTamaño: DWORD;
comenzar
si RegOpenKeyEx( HKEY_CURRENT_USER, 'Software', 0, KEY_READ o
KEY_ENUMERATE_SUB_KEYS, hKeyx) <> ERROR_SUCCESS entonces
comenzar
Showmessage('Error en RegOpenKeyEx.');
salida;
fin;
índice dw := 0;
repetir
tamaño dw := 255;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
si iRes = ERROR_NO_MORE_ITEMS entonces
romper
de lo contrario, si iRes = ERROR_SUCCESS entonces
comenzar
Cuadro de lista1.Items.Add(buf);
Inc(dwÍndice);
fin;
hasta que iRes <> ERROR_SUCCESS;
RegCloseKey( hKeyx );
fin;