PDA

View Full Version : سوال: گرفتن زیر کلیدهای رجیستری



loo30fer
شنبه 17 اردیبهشت 1390, 11:09 صبح
با سلام
من میخوام زیر کلیدهای تو آدرس کلیدم رو بگیرم مثلا این آدرس کلید منه :


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MyProg

و زیر کلیدهاشم اینها هستن : key1 و key2 و key3
ممنون میشم کمکم کنید با تشکر.

AliReza Vafakhah
شنبه 17 اردیبهشت 1390, 15:49 عصر
TRegistry.GetKeyNames(List: TStringList)

بعد از باز کردن کلید اصلی MyProg از کد بالا استفاده کنید و سپس متغییر List شامل تمام child کلید ها خواهد بود.

loo30fer
شنبه 17 اردیبهشت 1390, 16:48 عصر
ممنون ولی من وقتی از این کد استفاده میکنم خطا میگیره نمیدونم چرا ؟
var
Reg: TRegistry;
GetRV: String;
List: TStringList;
begin
Reg:= TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\Microsoft\MyProg', False) then begin
Reg.GetKeyNames(List);
Reg.CloseKey;
end;
finally
Reg.Free;
end;end;

tdkhakpur
شنبه 17 اردیبهشت 1390, 19:05 عصر
List رو ایجاد نکردید.


var
Reg: TRegistry;
GetRV: String;
List: TStringList;
begin
Reg:= TRegistry.Create;
List := TStringList.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\Microsoft\MyProg', False) then begin
Reg.GetKeyNames(List);
Reg.CloseKey;
end;
finally
Reg.Free;
List.Free;
end;end;

loo30fer
شنبه 17 اردیبهشت 1390, 22:43 عصر
ممنون ولی وقتی کلیدها رو میگیره باهم و به صورت لاین هست حالا چطور میتونم هم تعدادشون رو بگیرم و هرلاین رو به صورت جدا جدا بگیرم ؟

loo30fer
یک شنبه 18 اردیبهشت 1390, 13:55 عصر
ممنون مشکل حل شد راه حلش رو پیدا کردم.

zahra_no
یک شنبه 18 اردیبهشت 1390, 14:04 عصر
ممنون مشکل حل شد راه حلش رو پیدا کردم.
خب بگو ما هم یاد بگیریم

tdkhakpur
یک شنبه 18 اردیبهشت 1390, 14:11 عصر
ولی وقتی کلیدها رو میگیره باهم و به صورت لاین هست حالا چطور میتونم هم تعدادشون رو بگیرم و هرلاین رو به صورت جدا جدا بگیرم ؟
برای این کار میتونید لیست رو اسکن کنید مثل این


var
Reg: TRegistry;
GetRV: String;
List: TStringList;
i:integer;
begin
Reg:= TRegistry.Create;
List := TStringList.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\Microsoft\MyProg', False) then begin
Reg.GetKeyNames(List);
for i:=0 to (List.Count -1) do
Memo1.Lines.Add(List[i]);
Reg.CloseKey;
end;
finally
Reg.Free;
List.Free;
end;end;

loo30fer
یک شنبه 18 اردیبهشت 1390, 14:23 عصر
خب بگو ما هم یاد بگیریم
چشم , همینطور که تو کد میبینید یک حلقه ایجاد کردیم و چون TStringList یک لیست هست و از اسمش هم پیداست باید نامها رو بر اساس شمارش بگیریم پس لازمه اول بدونیم این لیست چندتاست برای همین برای تعداد دور زدن حلقه هم از List.Count استفاده کردیم تا تعداد لیست رو بده ولی چون لیست از 0 شروع میشه ما اون رو منهای 1 کردیم و برای نمایش کار List[i] رو داخل پیغام قرار دادم تا با هربار دور زدن حلقه اون مقدار رو از لیست بگیره و نمایش بده , ضمنا برای استفاده میتونید این کدی رو که قرار دادم رو بعد از Reg.CloseKey تو کد پست 4 قرار بدین و استفاده کنید.
for i := 0 to List.Count-1 do
ShowMessage(List[i]);
end;

AliReza Vafakhah
یک شنبه 18 اردیبهشت 1390, 15:46 عصر
برای اسکن بهتره تابع بازگشتی باشه.

Felony
چهارشنبه 21 اردیبهشت 1390, 10:35 صبح
برای اسکن بهتره تابع بازگشتی باشه.
به چه دلیل ؟

AliReza Vafakhah
چهارشنبه 21 اردیبهشت 1390, 16:37 عصر
به چه دلیل ؟

اگر قرار در رجیستری جستجو انجام بشه و مقداری یا کلید خاصی یافته بشه ، خوب تابع بازگشتی کوتاه تره و سریعتره (البته درسته که حافظه Stack زیادی مصرف میکنه)
اگر قرار باشه Child و Child های یک کلید جستجو شوند،شما چه روشی پیشنهاد می کنید؟

Felony
پنج شنبه 22 اردیبهشت 1390, 07:53 صبح
اگر قرار باشه Child و Child های یک کلید جستجو شوند،شما چه روشی پیشنهاد می کنید؟
اگر قرار باشه فقط Child های اصلی یک کلید جست و جو شوند ( که در این تاپیک هدف همین بوده ) نیازی به تابع بازگشتی نیست ولی اگر قرار باشه تمام زیر شاخه های یک کلید بررسی شوند اون وقت تابع بازگشتی میتونه راحت ترین گزینه باشه .

در هر صورت اسکنی که ایشون مد نظرشون بوده این بوده که به تک تک نام کلیدها دسترسی داشته باشند و ربطی به موضوع دوم که گفتم نداره و نیازی به تابع بازگشتی در این مورد نیست .