Erklärung: Jede Gruppe oder Einzelperson außer CSDN, die diesen Artikel nachdruckt, muss die Quelle und den Autor angeben.
Die mit Delphi gelieferte TRegistry-Klasse kann nur die grundlegenden Vorgänge der Registrierung implementieren. Wenn wir Änderungen in der Registrierung in Echtzeit überwachen oder alle Unterschlüssel unter einem bestimmten Schlüssel in der Registrierung scannen möchten, ist die TRegistry-Klasse machtlos. Ich habe lange am SDK herumgeknabbert und schließlich erkannte ich, dass ich mich nicht traute, es für mich zu behalten, also habe ich es den meisten Delphi-Enthusiasten gewidmet.
Für die Überwachung von Änderungen an registrierungsbezogenen Elementen ist eine API erforderlich: RegNotifyChangeKeyValue.
LONG RegNotifyChangeKeyValue(
HKEY hKey, // Handle für ein zu überwachendes Element
BOOL bWatchSubtree, // Ob die Unterschlüssel dieses Elements überwacht werden sollen
DWord dwNotifyFilter, // Welche Änderungen überwacht werden sollen
HANDLE hEvent, // Ereignisobjekt-Handle, das Registrierungsänderungsereignisse akzeptiert
BOOL fAsynchronous // Bericht vor Registrierungsänderungen oder nach Registrierungsänderungen
);
Beachten Sie, dass das obige hEvent das Ereignisobjekt-Handle ist, das Registrierungsänderungsereignisse akzeptiert. Wir müssen API: CreateEvent verwenden, um ein Systemereignisobjekt zu erstellen.
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES-Struktur
BOOL bManualReset, // Ob automatisch zurückgesetzt werden soll
BOOL bInitialState, // Ob der Anfangszustand festgelegt werden soll
LPCTSTR lpName //Der Name des Ereignisobjekts
);
Erstellen Sie ein neues Projekt und fügen Sie eine ListBox und zwei Schaltflächen hinzu.
//Schreiben Sie zunächst ein Beispiel für die Überwachung der Registrierung
//Überwachen Sie alle Unterschlüssel unter dem Element HKEY_CURRENT_USER/Software
PROzedur TForm1.Button1Click(Sender: TObject);
var
hNotify: THandle;
hKeyx:HKEY;
dwRes: DWORD;
beginnen
hNotify := CreateEvent( nil, //SECURITY_ATTRIBUTES-Struktur nicht verwenden
FALSE, //Nicht automatisch zurücksetzen
TRUE, // Anfangszustand festlegen
'RegistryNotify' //Der Name des Ereignisobjekts
);
wenn hNotify = 0 dann
beginnen
Showmessage('CreateEvent fehlgeschlagen.');
Ausfahrt;
Ende;
if RegOpenKeyEx(HKEY_CURRENT_USER, //Folge dem Schlüssel
'Software', //Unterschlüssel
0, //reserviert
KEY_NOTIFY, //zur Überwachung
hKeyx //Handle speichern
) <> ERROR_SUCCESS dann
beginnen
CloseHandle( hNotify );
Showmessage('RegOpenKeyEx fehlgeschlagen.');
Ausfahrt;
Ende;
if RegNotifyChangeKeyValue( hKeyx, //Unterschlüssel-Handle überwachen
TRUE, //Überwachen Sie die Unterschlüssel dieses Elements
REG_NOTIFY_CHANGE_NAME oder REG_NOTIFY_CHANGE_LAST_SET,
hNotify, //Ereignisobjekt-Handle, das Registrierungsänderungsereignisse akzeptiert
TRUE //Vor Registrierungsänderungen melden
) <> ERROR_SUCCESS dann
beginnen
CloseHandle( hNotify );
RegCloseKey( hKeyx );
Showmessage('RegNotifyChangeKeyValue fehlgeschlagen');
Ausfahrt;
Ende;
dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //Eine Minute lang überwachen
wenn dwRes = 0 dann
Showmessage( 'Registrierung wird geändert.' );
CloseHandle( hNotify );
RegCloseKey( hKeyx );
Ende;
Es ist zu beachten, dass API: WaitForSingleObject erst dann zurückkehrt, wenn das Registrierungsänderungsereignis eintritt oder eine Zeitüberschreitung auftritt. Während dieser Zeit verliert unser Programm die Reaktion. Die Lösung besteht darin, einen neuen Thread zu erstellen und die Registrierung im neuen Thread zu überwachen.
Zwei weitere APIs werden zum Scannen der Registrierung verwendet: RegEnumKey und RegEnumValue.
LONG RegEnumKey(
HKEY hKey, // Handle des zu scannenden Registrierungselements
DWORD dwIndex,//zu scannende Seriennummer des Unterschlüssels
LPTSTR lpName,//Der zu scannende Unterschlüsselname
LPDWORD lpcbName, // Der zu scannende Unterschlüsselname belegt Platz
);
Die Methode zur Verwendung dieser Funktion lautet: Weisen Sie zuerst dwIndex 0 zu, rufen Sie dann RegEnumKey auf und rufen Sie dann RegEnumKey auf, bis der Rückgabewert ERROR_NO_MORE_ITEMS ist, was angibt, dass keine weiteren Unterelemente vorhanden sind.
//Beispiel für das Scannen der Registrierung
//Demonstriert nur, wie eine Ebene von Unterelementen unter HKEY_CURRENT_USER/Software aufgelistet wird
procedure TForm1.Button2Click(Sender: TObject);
var
buf: Array [0..255] von char;
iRes: Ganzzahl;
hKeyx:HKEY;
dwIndex, dwSize: DWORD;
beginnen
wenn RegOpenKeyEx( HKEY_CURRENT_USER, 'Software', 0, KEY_READ oder
KEY_ENUMERATE_SUB_KEYS, hKeyx ) <> ERROR_SUCCESS dann
beginnen
Showmessage('RegOpenKeyEx fehlgeschlagen.');
Ausfahrt;
Ende;
dwIndex := 0;
wiederholen
dwSize := 255;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
wenn iRes = ERROR_NO_MORE_ITEMS dann
brechen
sonst wenn iRes = ERROR_SUCCESS dann
beginnen
Listbox1.Items.Add(buf);
Inc(dwIndex);
Ende;
bis iRes <> ERROR_SUCCESS;
RegCloseKey( hKeyx );
Ende;