PDA

View Full Version : جستجوی بازگشتی در رجیستری



mehditabasi
پنج شنبه 18 مهر 1387, 10:08 صبح
با سلام خدمت تمام دوستان
من قطعه کدی لازم دارم که به صورت بازگشتی در رجیستری جستجو کند و مقادیر کلیدهای خاصی را درون یک لیست باکس برگرداند.
به طور مثال می خواهم درون مسیر زیر در رجیستری جستجو کنم و تمام مسیر های نصب را پیدا کنم.
HKEY_CURRENT_USER\Software\Noor
منظورم از این مسیر تمام زیر درختهای موجود در این مسیر است.

در ضمن در سایت خیلی جستجو کردم ولی جوابی پیدا نکردم. تمام مطالب درباره نوشتن و خواندن در رجیستری بود که درباره این مطالب اطلاع کافی دارم.

با تشکر از تمامی دوستان

Mahmood_M
پنج شنبه 18 مهر 1387, 21:35 عصر
منظورم از این مسیر تمام زیر درختهای موجود در این مسیر است.
و

مقادیر کلیدهای خاصی را درون یک لیست باکس برگرداند
اگر منظورتون اینه که فقط Key های موجود در یک مسیر رو پیدا کنید ( نه Value های اون مسیر رو ) و این Key ها باید ویژگی خاصی داشته باشند ، می تونید از رکورد TRegKeyInfo کمک بگیرید ...
در Unit رجیستری رکوردی به نام TRegKeyInfo وجود داره که اطلاعاتی در مورد یک Key در یک مسیر رو بهتون میده ، اطلاعاتی که بهتون میده به شرح زیر هست :

تعداد SubKey ها
NumSubKeys: Integer;
طول نام Key ای که نامش بیشترین طول ( Length ) رو داره
MaxSubKeyLen: Integer;
تعداد Value های موجود در اون کلید
NumValues: Integer;
طول نام Value ای که نامش بیشترین طول رو داره
MaxValueLen: Integer;
اندازه ( Length یا طول ) Data-Value ای که اندازه اطلاعاتش از همه بیشتر هست
MaxDataLen: Integer;
زمان آخرین زمانی که به کلید مورد نظر Value ای اضافه شده ( آخرین Write Value درواقع )
FileTime: TFileTime;

بهتره بگید منظورتون از " خاص " چیه ؟ در هر صورت یکی از ویژگی های بالا میتونه کلید ( یا کلیدهای ) مورد نظرتون رو از بقیه متمایز کنه ...
خوب تا اینجا شما اطلاعات یک کلید رو بدست آوردید ، اما چطور اسم کلیدها رو پیدا کنیم ؟!
برای این کا می تونید به صورت زیر عمل کنید :
کلاس TRegistry یک متد داره که کلیدهای موجود در یک کلید دیگه ( SubKey های یک کلید رو ) در یک TStrings وارد میکنه ، میتونید یک کلاس TStrings بسازید و لیست SubKey ها رو توی اون بریزید ، تا اینجا شما لیست کلیدها و تعداد اونها و اطلاعات مربوط به اونها رو دارید و میتونید به راحتی و با یک مقایسه ساده به هدفتون برسید ...
فرض کنید می خواید کلیدهایی که تعداد Value هاشون بالای 20 هست رو پیدا کنید ، در این صورت کد زیر مشکلتون رو حل می کنه :

procedure TForm1.BitBtnClick(Sender: TObject);
var
R : TRegistry;
RKInfo, RSKInfo : TRegKeyInfo;
I : Integer;
KeysList : TStrings;
begin
KeysList := TStringList.Create;
R := TRegistry.Create;
R.RootKey := HKEY_CURRENT_USER;
R.OpenKey('Control Panel\Desktop', False);
R.GetKeyInfo(RKInfo);
R.GetKeyNames(KeysList);
try
for I := 0 to RKInfo.NumSubKeys - 1 do
begin
R.OpenKey('Control Panel\Desktop'+KeysList.Strings[I], False);
R.GetKeyInfo(RSKInfo);
if RSKInfo.NumValues > 20 then
ListBox1.Items.Add('Control Panel\Desktop'+KeysList.Strings[I]);
end;
finally
KeysList.Free;
end;
end;
در کد بالا ، ابتدا یک کلید باز میشه اطلاعات و نام SubKey های اون گرفته میشن ( در RKInfo که یک رکورد از نوع TRegKeyInfo هست ) ، بعد تک تک SubKey ها در حلقه For باز میشن و اطلاعاتشون در RSKInfo ( که یک رکورد از نوع TRegKeyInfo هست ) ثبت میشه و در پایان هم SubKey هایی که تعداد Value هاشون بیشتر از 20 هست در یک ListBox وارد میشن ...

اگه مشکلی هست بگید تا مثالی قرار بدم ...

موفق و پیروز باشید ...

mehditabasi
شنبه 20 مهر 1387, 09:21 صبح
از کمک شما بسیار متشکرم.
مشکل حل شد.