PDA

View Full Version : جستجو در رجيستري ويندوز



AliReza Vafakhah
یک شنبه 21 مهر 1387, 14:20 عصر
با سلام خدمت همه دوستان برنامه نويس

خيلي وقت بود (اول تابستان ) مي خواستم يه برنامه بنويسم كه در رجيستري كليدها و داده ها را جستجو كند (دلفي )

دوستان سرتون رو درد نيارم كه يك ماه و نيم طول كشيد، اما بلعخره با ياري خدا اين برنامه رو نوشتم .

حالا اين برنامه رو در اختيار شما دوستان قرار مي دهم كه اگه دوست داشتيد نظري هم به اين برنامه كوچك من هم بدهيد و من را بهتر نوشتن اين برنامه ياري كنيد (البته نسبتا كامل است)

راستي املاي فارسي من خيلي ضعيف است(نمره املاي من يه زماني صفر چهار گوش بوده!!!)

فراموش نكنيم كه هنوز هيچ برنامه اي به وجود نيامده كه بدون مشكل باشد

Mask
یک شنبه 21 مهر 1387, 19:36 عصر
در این سایت برنامه بدون وجود کد و سورس هیچ ارزشی نداره.
در حال حاضر با این برنامه که سورسشو ندادید میشه گفت این کار رو هم خود ویندوز انجام میده.!

AliReza Vafakhah
یک شنبه 21 مهر 1387, 22:43 عصر
در این سایت برنامه بدون وجود کد و سورس هیچ ارزشی نداره.


دوست عزيز اين الگوريتم جستجو است

راستي چند تابع ديگه هم است

كسي به خواد تمام سورس رو هم در اختيارش قرار ميدم.




procedure prj.RegScan(HkRoot:HKEY;Str_Path, StrKey_To_Find: string;
Main_Count: integer);
var
SList,Vlist:TStringList;
Reg:TRegistry;
S,k:string;
i,j,g,index:LongInt;
label TryFindKey,CantRead;
begin

if (prjClass.EndSearch)then
begin
Frm_Main.Lbl_Status.Caption :=StrParentKey + Frm_Main.Txt_address.Text;
Exit;
end;
Str_Local_Path :=Str_Path;
CountOfKey:=Main_Count;
Reg:=TRegistry.Create ;
SList :=TStringList.Create;
Vlist:=TStringList.Create;
Reg.RootKey:=HkRoot;
Reg.OpenKey(Str_Local_Path,false);
Reg.GetKeyNames(SList);
with Frm_Main do
begin
lbl_Lst_found_Count.Caption :=' تعداد عناصر ليست ' + IntToStr(Lst_Founded.Items.Count) ;
lbl_Lst_cant_Count.Caption :=' تعداد عناصر ليست ' + IntToStr(Lst_CantRead.Items.Count) ;
TryFindKey:
Lbl_Status.Caption :=StrParentKey +Str_Local_Path ;
Reg.Free;
Reg:=TRegistry.Create ;
Reg.RootKey:=HkRoot;
Reg.OpenKey(Str_Local_Path,false);
Reg.GetValueNames(Vlist);
if (CountOfKey=-1)then
begin
CantRead:
s:='';
for I := Length(Str_Local_Path) downto 1 do
begin
if (MidStr(Str_Local_Path ,i,1)='\') then break;
s:=MidStr(Str_Local_Path,i,1)+s;
end;
k:=s;
Delete(Str_Local_Path,length(Str_Local_Path)-length(k),length(k)+1);
reg.Free;
reg:=TRegistry.Create;
reg.RootKey:=hkRoot;
reg.OpenKey(Str_Local_Path,false);
reg.GetKeyNames(SList );
index:=SList.IndexOf(k);
if (index=0) then
begin
s:='';
for g:= length(Str_Local_Path)+1 downto 1 do
begin
if (MidStr(Str_Local_Path ,g,1)='\') then break;
s:=MidStr(Str_Local_Path,g,1)+s;
end;
if s<>'' then
Delete(Str_Local_Path,length(Str_Local_Path)-length(s),length(s)+1);
Lbl_Status.Caption :=StrParentKey +Str_Local_Path ;
reg.Free;
reg:=TRegistry.Create;
reg.RootKey:=hkRoot;
reg.OpenKey(Str_Local_Path,false);
reg.GetKeyNames(SList);
j:=SList.IndexOf(s);
CountOfKey:=j-1;
end;
if (index<>0)and (index<>-1) then
CountOfKey:=index-1;
end;
if (prjClass.EndSearch)then
begin
Lbl_Status.Caption :=StrParentKey +Txt_address.Text;
Exit;
end;

if (CountOfKey<>-1) then
prjClass.Find(ROOTHKEY,Str_Local_Path ,StrKey_To_Find ,CountOfKey);
if (CountOfKey =-1) then goto TryFindKey;
if (CountOfKey >=0) then
begin
k:=SList.Strings[CountOfKey];
if (k='') then
begin
Lst_CantRead.Items.Add('کلید #### '+Str_Local_Path);
goto CantRead;
end;
reg.Free ;
reg:=TRegistry.Create ;
reg.RootKey:=HkRoot;
reg.OpenKey(Str_Local_Path +'\'+k,false);
reg.GetKeyNames(SList );
CountOfKey:=SList.Count -1;
Str_Local_Path:=Str_Local_Path +'\'+k;
Lbl_Status.Caption :=StrParentKey +Str_Local_Path ;
Find(HkRoot,Str_Local_Path ,StrKey_To_Find,CountOfKey) ;
if (CountOfKey=-1) then goto TryFindKey;
end;
Find(HkRoot,Str_Local_Path ,StrKey_To_Find,CountOfKey) ;
if (prjClass.EndSearch)then
begin
Lbl_Status.Caption :=StrParentKey +Txt_address.Text;
Exit;
end;
end;
FreeAndNil(SList);
FreeAndNil(Reg);
FreeAndNil(Vlist);
end;

vcldeveloper
دوشنبه 22 مهر 1387, 00:41 صبح
1- فکر کنم الان یه چند ده سالی میشه که استفاده از Goto نه تنها منسوخ شده، بلکه یک روش غلط برای کنترل مسیر اجرای برنامه شناخته میشه!

2- قبلا چندین بار گفته شده که همیشه سعی کنید عادت کنید Create و Free را به همراه بلوک try-finally استفاده کنید.

3- معلوم نیست چرا دائما Reg را برای هر مقداردهی یک بار Create و Free می کنید! در کل این تابع شما فقط به یک Create و یک Free برای Reg نیاز داشتید.

4- همیشه وقتی میخواید رشته ایی را به تابعی پاس بدید، و اون تابع هم رشته را تغییر نمیده، رشته را بصورت const پاس بدید.

5- لزومی نداشت کدهای مربوط به رابط کاربر (مثل نمایش متن Lableها) را در کد تابع استفاده کنید. این کار باعث میشه که تابع جستجوی شما وابسته به رابط کاربر باشه، و امکان استفاده ازش در برنامه های مختلف از بین بره.

6- همچین کدی چون در داخل یک Thread اجرا نمیشه، میتونه به راحتی باعث قفل شدن رابط کاربر برنامه بشه.

7- بررسی نکردم چطور دنبال رشته مورد نظر میگردید، ولی احتمالا باید بشه الگوریتم بهینه تری برای جستجو نوشت.