Déclaration : Tout groupe ou individu autre que le CSDN qui réimprime cet article doit en indiquer la source et l'auteur.
La classe TRegistry fournie avec Delphi ne peut implémenter que les opérations de base du registre. Si nous voulons surveiller les modifications dans le registre en temps réel ou analyser toutes les sous-clés sous une clé spécifique dans le registre, la classe TRegistry est impuissante. J'ai longtemps rongé le SDK et j'ai finalement réalisé que la surveillance et l'analyse du registre par Delphi ne m'ont pas permis de le garder pour moi, je l'ai donc dédié à la majorité des passionnés de Delphi.
La surveillance des modifications dans les éléments liés au registre nécessite une API : RegNotifyChangeKeyValue.
LONG RegNotifyChangeKeyValue(
HKEY hKey, // handle d'un élément à surveiller
BOOL bWatchSubtree, // S'il faut surveiller les sous-clés de cet élément
DWord dwNotifyFilter, // Quels changements surveiller
HANDLE hEvent, // Handle d'objet d'événement qui accepte les événements de modification du registre
BOOL fAsynchronous // Rapport avant les modifications du registre ou après les modifications du registre
);
Notez que le hEvent ci-dessus est le handle d'objet d'événement qui accepte les événements de modification du registre. Nous devons utiliser l'API : CreateEvent pour créer un objet d'événement système.
POIGNÉE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // Structure SECURITY_ATTRIBUTES
BOOL bManualReset, // S'il faut réinitialiser automatiquement
BOOL bInitialState, // S'il faut définir l'état initial
LPCTSTR lpName //Le nom de l'objet événement
);
Créez un nouveau projet et ajoutez une ListBox et deux Buttons.
//Écrivez d'abord un exemple de surveillance du registre
//Surveiller toutes les sous-clés sous l'élément HKEY_CURRENT_USER/Software
PRécédure TForm1.Button1Click(Expéditeur : TObject);
var
hNotifier : THandle ;
hKeyx:HKEY;
dwRes : DWORD ;
commencer
hNotify := CreateEvent( nil, //Ne pas utiliser la structure SECURITY_ATTRIBUTES
FALSE, //Ne pas réinitialiser automatiquement
VRAI, //Définir l'état initial
'RegistryNotify' //Le nom de l'objet événement
);
si hNotify = 0 alors
commencer
Showmessage('CreateEvent a échoué.');
sortie;
fin;
if RegOpenKeyEx(HKEY_CURRENT_USER, //Suivez la clé
'Logiciel', //Sous-clé
0, //réservé
KEY_NOTIFY, //pour la surveillance
hKeyx //Enregistrer le handle
) <> ERROR_SUCCESS puis
commencer
CloseHandle( hNotifier );
Showmessage('RegOpenKeyEx a échoué.');
sortie;
fin;
if RegNotifyChangeKeyValue ( hKeyx, // Descripteur de sous-clé de surveillance
TRUE, //Surveiller les sous-clés de cet élément
REG_NOTIFY_CHANGE_NAME ou REG_NOTIFY_CHANGE_LAST_SET,
hNotify, // Descripteur d'objet d'événement qui accepte les événements de modification du registre
VRAI //Rapport avant les modifications du registre
) <> ERROR_SUCCESS puis
commencer
CloseHandle( hNotifier );
RegCloseKey( hKeyx );
Showmessage('RegNotifyChangeKeyValue a échoué');
sortie;
fin;
dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //Surveiller pendant une minute);
si dwRes = 0 alors
Showmessage( 'Le registre sera modifié.' );
CloseHandle( hNotifier );
RegCloseKey( hKeyx );
fin;
Il convient de noter que l'API : WaitForSingleObject ne reviendra pas tant que l'événement de modification du registre ne se produit pas ou n'expire pas. Pendant cette période, notre programme perdra la réponse. La solution consiste à créer un nouveau thread et à surveiller le registre dans le nouveau thread.
Deux autres API sont utilisées pour analyser le registre : RegEnumKey et RegEnumValue.
LONG RegEnumKey(
HKEY hKey, // handle de l'élément de registre à analyser
DWORD dwIndex,//numéro de série de sous-clé à analyser
LPTSTR lpName,//Le nom de la sous-clé à analyser
LPDWORD lpcbName, // Le nom de la sous-clé à analyser occupe de l'espace
);
La méthode d'utilisation de cette fonction est la suivante : attribuez d'abord 0 à dwIndex, appelez RegEnumKey ; puis Inc(dwIndex), puis appelez RegEnumKey jusqu'à ce que la valeur de retour soit ERROR_NO_MORE_ITEMS, indiquant qu'il n'y a plus de sous-éléments.
//Exemple d'analyse du registre
//Montre uniquement comment énumérer un niveau de sous-éléments sous HKEY_CURRENT_USER/Software
procédure TForm1.Button2Click(Expéditeur : TObject);
var
buf : tableau [0..255] de caractères ;
iRes : entier ;
hKeyx:HKEY;
dwIndex, dwSize : DWORD ;
commencer
si RegOpenKeyEx (HKEY_CURRENT_USER, 'Software', 0, KEY_READ ou
KEY_ENUMERATE_SUB_KEYS, hKeyx ) <> ERROR_SUCCESS puis
commencer
Showmessage('RegOpenKeyEx a échoué.');
sortie;
fin;
dwIndex := 0;
répéter
dwTaille := 255 ;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
si iRes = ERROR_NO_MORE_ITEMS alors
casser
sinon si iRes = ERROR_SUCCESS alors
commencer
Listbox1.Items.Add(buf);
Inc(dwIndex);
fin;
jusqu'à iRes <> ERROR_SUCCESS ;
RegCloseKey( hKeyx );
fin;