بيان: يجب على أي مجموعة أو فرد بخلاف CSDN الذي يعيد طباعة هذه المقالة الإشارة إلى المصدر والمؤلف.
يمكن لفئة TRegistry التي تأتي مع دلفي تنفيذ العمليات الأساسية للسجل فقط. إذا أردنا مراقبة التغييرات في السجل في الوقت الفعلي أو فحص جميع المفاتيح الفرعية تحت مفتاح معين في السجل، فإن فئة TRegistry غير فعالة. لقد قضمت فترة طويلة في SDK، وأدركت أخيرًا أن مراقبة دلفي وفحصها للسجل لم أجرؤ على الاحتفاظ بها لنفسي، لذلك خصصتها لغالبية عشاق دلفي.
تتطلب مراقبة التغييرات في العناصر المتعلقة بالتسجيل واجهة برمجة التطبيقات: RegNotifyChangeKeyValue.
طويلة RegNotifyChangeKeyValue(
HKEY hKey، // التعامل مع عنصر لمراقبته
BOOL bWatchSubtree, // ما إذا كنت تريد مراقبة المفاتيح الفرعية لهذا العنصر
DWord dwNotifyFilter, // ما هي التغييرات المراد مراقبتها
HANDLE hEvent, // مقبض كائن الحدث الذي يقبل أحداث تغيير التسجيل
BOOL fAsynchronous // الإبلاغ قبل تغييرات التسجيل أو بعد تغييرات التسجيل
);
لاحظ أن hEvent أعلاه هو معالج كائن الحدث الذي يقبل أحداث تغيير التسجيل. نحتاج إلى استخدام API: CreateEvent لإنشاء كائن حدث النظام.
التعامل مع إنشاء حدث (
LPSECURITY_ATTRIBUTES lpEventAttributes، // هيكل SECURITY_ATTRIBUTES
BOOL bManualReset، // ما إذا كان سيتم إعادة التعيين تلقائيًا
BOOL bInitialState، // ما إذا كان سيتم تعيين الحالة الأولية
LPCTSTR lpName // اسم كائن الحدث
);
أنشئ مشروعًا جديدًا وأضف ListBox وزرين.
// اكتب أولاً مثالاً لمراقبة التسجيل
// مراقبة جميع المفاتيح الفرعية ضمن عنصر HKEY_CURRENT_USER/Software
الإجراء TForm1.Button1Click(Sender: TObject);
فار
hNotify: Thandle؛
hKeyx:HKEY;
dwRes: DWORD;
يبدأ
hNotify := CreateEvent( nil, // لا تستخدم بنية SECURITY_ATTRIBUTES
خطأ، // لا تقم بإعادة التعيين تلقائيًا
صحيح، //تعيين الحالة الأولية
'RegistryNotify' // اسم كائن الحدث
);
إذا hNotify = 0 ثم
يبدأ
Showmessage('فشل إنشاء الحدث.');
مخرج؛
نهاية؛
إذا RegOpenKeyEx(HKEY_CURRENT_USER, //اتبع المفتاح
"البرمجيات"، // المفتاح الفرعي
0، //محجوز
KEY_NOTIFY، // للمراقبة
hKeyx //حفظ المقبض
) <> ERROR_SUCCESS إذن
يبدأ
CloseHandle( hNotify );
Showmessage('فشل RegOpenKeyEx.');
مخرج؛
نهاية؛
if RegNotifyChangeKeyValue( hKeyx, //مقبض المفتاح الفرعي لمراقبة
صحيح، // مراقبة المفاتيح الفرعية لهذا العنصر
REG_NOTIFY_CHANGE_NAME أو REG_NOTIFY_CHANGE_LAST_SET،
hNotify, // مقبض كائن الحدث الذي يقبل أحداث تغيير التسجيل
صحيح // الإبلاغ قبل تغيير التسجيل
) <> ERROR_SUCCESS إذن
يبدأ
CloseHandle( hNotify );
RegCloseKey( hKeyx );
Showmessage('فشل RegNotifyChangeKeyValue');
مخرج؛
نهاية؛
dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //مراقبة لمدة دقيقة واحدة
إذا dwRes = 0 ثم
Showmessage( "سيتم تغيير التسجيل.' );
CloseHandle( hNotify );
RegCloseKey( hKeyx );
نهاية؛
تجدر الإشارة إلى أن واجهة برمجة التطبيقات: WaitForSingleObject لن تعود إلا بعد حدوث حدث تغيير التسجيل أو انتهاء المهلة. خلال هذه الفترة، سيفقد برنامجنا الاستجابة. الحل هو إنشاء موضوع جديد ومراقبة التسجيل في الموضوع الجديد.
يتم استخدام واجهتي برمجة تطبيقات أخرى لفحص السجل: RegEnumKey وRegEnumValue.
مفتاح RegEnum طويل (
HKEY hKey، // مقبض عنصر التسجيل المراد فحصه
DWORD dwIndex,//الرقم التسلسلي للمفتاح الفرعي المراد فحصه
LPTSTR lpName,//اسم المفتاح الفرعي المراد فحصه
LPDWORD lpcbName, // يشغل اسم المفتاح الفرعي المراد فحصه مساحة
);
أسلوب استخدام هذه الدالة هو: أولاً تعيين قيمة 0 إلى dwIndex، ثم استدعاء RegEnumKey؛ ثم Inc(dwIndex)، ثم استدعاء RegEnumKey حتى تصبح قيمة الإرجاع ERROR_NO_MORE_ITEMS، للإشارة إلى عدم وجود المزيد من العناصر الفرعية.
// مثال لمسح السجل
// يوضح فقط كيفية تعداد مستوى واحد من العناصر الفرعية ضمن HKEY_CURRENT_USER/Software
الإجراء TForm1.Button2Click(Sender: TObject);
فار
buf: صفيف [0..255] من char؛
iRes : عدد صحيح؛
hKeyx:HKEY;
dwIndex، dwSize: DWORD؛
يبدأ
إذا كان RegOpenKeyEx( HKEY_CURRENT_USER، "البرنامج"، 0، KEY_READ أو
KEY_ENUMERATE_SUB_KEYS، hKeyx ) <> ERROR_SUCCESS ثم
يبدأ
Showmessage('فشل RegOpenKeyEx.');
مخرج؛
نهاية؛
dwIndex := 0;
يكرر
dwSize := 255;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
إذا iRes = ERROR_NO_MORE_ITEMS إذن
استراحة
وإلا إذا كان iRes = ERROR_SUCCESS إذن
يبدأ
Listbox1.Items.Add(buf);
شركة(dwIndex);
نهاية؛
حتى iRes <> ERROR_SUCCESS؛
RegCloseKey( hKeyx );
نهاية؛