Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.141.6] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Подскажите, пожалуйста, алгоритм поиска по реестру Windows. У меня тут есть один, да вот только он уж ОЧЕНЬ много памяти требует для своей работы... слишком много... неоправданно много... Пик использования памяти приложением оказалася аж на 64 Мбайтах... кошмар... эта прога потом выгружается секунд 20... Может у кого-нибудь есть алгоритм по оптимальнее? Помогите, пожалуйста, меня уже сроки начинают поджимать... С уважением, Жирнов Максим |
Сообщ.
#2
,
|
|
|
Обычной рекурсией...
|
Сообщ.
#3
,
|
|
|
Я знаю, что для поиска по реестру надо использовать рекурсию, я кстати сказать её использую в алгоритме... да вот только всё-равно он у меня уж очень не оптимальный... Если у кого-нибудь есть алгоритм поиска по реестру, очень прошу пришлите мне его... пожалуйста... EMail: Zhirnov5@mail.ru
|
Сообщ.
#4
,
|
|
|
Взято из оной плохой проги.
Функция экспортирует рееств TXT Function dblBackSlash(t:string):string; var k:longint; begin result:=t; {Strings are not allowed to have} for k:=length(t) downto 1 do {single backslashes} if result[k]='\' then insert('\',result,k); end; Procedure ExportRegistryBranch (rootsection : Integer; regroot:String; filename:String); var reg:tregistry; f:textfile; p:PCHAR; s911:string; Procedure ProcessBranch(root:string); {recursive sub-procedure} var values,keys:tstringlist; i,j,k:longint; s,t:string; {longstrings are on the heap, not on the stack!} begin {$C-} {$I-} {$M-} {$Q-} {$R-} Writeln(f); {write blank line} case rootsection of HKEY_CLASSES_ROOT : begin s:='HKEY_CLASSES_ROOT'; end; HKEY_CURRENT_USER :s:='HKEY_CURRENT_USER'; HKEY_LOCAL_MACHINE :s:='HKEY_LOCAL_MACHINE'; HKEY_USERS :s:='HKEY_USERS'; HKEY_PERFORMANCE_DATA:s:='HKEY_PERFORMANCE_DATA'; HKEY_CURRENT_CONFIG :s:='HKEY_CURRENT_CONFIG'; HKEY_DYN_DATA :s:='HKEY_DYN_DATA'; end; Writeln(f,'['+s+'\'+root+']'); {write section name in brackets} reg.OpenKey(root,false); values:=tstringlist.create; keys:=tstringlist.create; reg.getvaluenames (values); {get all value names} reg.getkeynames (keys); {get all sub-branches} for i:=0 to values.count-1 do {write all the values first} begin s:=values[i]; t:=s; {s=value name} if s='' then s:='@' {empty means "default value", write as @} else s:='"' + s + '"'; {else put in quotes} write(f,dblbackslash(s)+'='); {write the name of the key to the file} Case reg.Getdatatype(t) of {What type of data is it?} rdString,rdExpandString: {String-type} Writeln(f,'"' + dblbackslash(reg.readstring(t)+'"')); rdInteger : {32-bit unsigned long integer} Writeln(f,'dword:' + inttohex(reg.readinteger(t),8)); {write an array of hex bytes if data is "binary." Perform a line feed after approx. 25 numbers so the line length stays within limits} rdBinary : begin write(f,'hex:'); j:=reg.getdatasize(t); {determine size} getmem(p,j); {Allocate memory} reg.ReadBinaryData(t,p^,J); {read in the data, treat as pchar} for k:=0 to j-1 do begin Write(f,inttohex(byte(p[k]),2)); {Write byte as hex} if k<>j-1 then {not yet last byte?} begin write(f,','); {then write Comma} if (k>0) and ((k mod 25)=0) {line too long?} then writeln(f,'\'); {then write Backslash + lf} end; {if} end; {for} freemem(p,j); {free the memory} writeln(f); {Linefeed} end; ELSE writeln(f,'""'); {write an empty string if datatype illegal/unknown} end;{case} end; {for} reg.closekey; {value names all done, no longer needed} values.free; {Now al values are written, we process all subkeys} {Perform this process RECURSIVELY...} for i:=0 to keys.count-1 do ProcessBranch(root+'\'+keys[i]); keys.free; {this branch is ready} end; begin s911:=regroot; if length(s911)>3 then begin if regroot[length(s911)]='\' then {No trailing backslash} setlength(regroot,length(regroot)-1); end; Assignfile(f,filename); {create a text file} {$I-} rewrite(f); Writeln(f,'))))'); // IF ioresult<>0 then EXIT; Writeln(f,'REGEDIT4'); {"magic key" for regedit} Flush(f); reg:=tregistry.create; Writeln(f,'))))'); Flush(f); {$I-} try reg.rootkey:=rootsection; ProcessBranch(regroot); {Call the function that writes the branch and all subbranches} finally reg.free; {ready} closefile(f); end; end; Пример обрашения ExportRegistryBranch(HKEY_CURRENT_USER,'Software\Microsoft\Internet Account Manager\Accounts','fi_name.txt'); |