[ borovac @ 20.12.2004. 18:12 ] @
1. Znam kako dobiti sve subkey-eve nekog ključa, ali kako dobiti subkey-eve korjena npr. HKEY_CURRENT_USER? 2. Kako dobiti sve subfoldere nekog foldera? |
[ borovac @ 20.12.2004. 18:12 ] @
[ bancika @ 20.12.2004. 19:37 ] @
1) ubaci promenljivu Reg: TRegistry i otkucaj u telu neke procedure Reg i tacku, onda pogledaj koje sve metode imas i signuran sam da postoji neka intuitivnog imena koja radi bas to
![]() 2) Code: procedure ScanFolder(Folder: string); var FindResult: integer; SearchRec : TSearchRec; begin FindResult := FindFirst('c:\', faDirectory, SearchRec); while FindResult = 0 do begin Memo1.Lines.Add(SearchRec.Name); //tu ubaci rekurzivni poziv tipa ScanFolder('c:\' + SearchRec.Name) FindResult := FindNext(SearchRec); end; end; FindClose(SearchRec); end ako hoces mozes da napravis rekurzivno da se poziva za svaki folder pa da onda dobijes full scan foldera [Ovu poruku je menjao bancika dana 20.12.2004. u 20:39 GMT+1] [ reiser @ 20.12.2004. 19:38 ] @
1.
Code: procedure EnumerateRegKeys(const HK : HKEY); var countSubKeys : Cardinal; C1 : Integer; keyName : Array[0..MAX_PATH] of Char; keyLength : Cardinal; begin RegQueryInfoKey(HK, nil, nil, nil, @countSubKeys, nil, nil, nil, nil, nil, nil, nil); For C1 := 0 to countSubKeys - 1 Do Begin keyLength := MAX_PATH; RegEnumKeyEx(HK, C1, keyName, keyLength, nil, nil, nil, nil); ListBox1.Items.Add(keyName); End; end; 2. Code: procedure EnumerateSubFolders(path : String; const attrib : Integer); var SRec : TSearchRec; begin If path[Length(path)] <> '\' Then path := path + '\'; If FindFirst(Path + '*.*', faDirectory + attrib, SRec) = 0 Then repeat If (SRec.Name <> '.') and (SRec.Name <> '..') and (SRec.Attr and faDirectory <> 0) Then ListBox1.Items.Add(SRec.Name); until FindNext(SRec) <> 0; FindClose(SRec); end; [ bancika @ 20.12.2004. 19:41 ] @
gle, u isto vreme :)
za ovo Code: If path[Length(path)] <> '\' Then path := path + '\'; imas elegantnije resenje Code: Path := IncludeTrailingBackslash(Path) [ reiser @ 20.12.2004. 19:45 ] @
Heh ;)
[ borovac @ 22.12.2004. 12:45 ] @
Thnx, this was usefull
[ borovac @ 29.12.2004. 18:42 ] @
Još pitanja o registriju.
Ako znam ime vrijednosti (value name), kako znati kojeg je tipa (value type) njena vrijednost (value data)?? [ borovac @ 02.01.2005. 14:46 ] @
Kako dobiti DataValue iz registrija ako je taj Value REG_DWORD tipa?
Nešto sam pokušavao sa RegEnumValue ali ne ide. [ Srki_82 @ 03.01.2005. 00:24 ] @
Ovako... ne mozes direktno procitati value data i value type ako znas value name. Treba da koristis funkciju RegEnumValue, ali joj kazes redni broj vrednosti koju zelis i ona ti vrati value name, data i type. Ne mogu sad da ti pisem kod... mora nekad i da se spava. Ako ne nadjes resenje napisacu ti ga za koji dan kad budem bio slobodan.
Pogledaj ovde: http://msdn.microsoft.com/libr.../sysinfo/base/regenumvalue.asp [ borovac @ 03.01.2005. 11:45 ] @
Nije to problem. Problem je kako dobiti value data ako joj je tip REG_DWORD.
Ovako se dobije vrijednost stringa. Code: procedure TForm1.Button1Click(Sender: TObject); var Registry:TRegistry; hk:hkey; i:integer; ValueList:TStrings; d:Array[0..MAX_PATH] of Char; valueName:Array[0..MAX_PATH] of Char; valueLength,aa:cardinal; begin Registry:=TRegistry.Create(KEY_ALL_ACCESS); ValueList:=TStringList.Create; Registry.RootKey:=HKEY_CURRENT_USER; Registry.OpenKey('Control Panel\Desktop',false); registry.GetValueNames(ValueList); hk:=Registry.CurrentKey; aa:=255; for i:=1 to ValueList.Count do if ValueList.Strings[i-1]='DragWidth' then begin RegEnumValue(hk,i-1,valueName,valueLength,nil,nil,@d,@aa); ShowMessage(d); end; registry.CloseKey; end; [ Srki_82 @ 03.01.2005. 12:22 ] @
Probaj nesto ovako:
Code: procedure TForm1.Button1Click(Sender: TObject); var Registry:TRegistry; hk:hkey; i:integer; ValueList:TStrings; d:Array[0..MAX_PATH] of Char; valueName:Array[0..MAX_PATH] of Char; valueLength,aa:cardinal; Data:DWORD; begin Registry:=TRegistry.Create(KEY_ALL_ACCESS); ValueList:=TStringList.Create; Registry.RootKey:=HKEY_CURRENT_USER; Registry.OpenKey('Control Panel\Desktop',false); registry.GetValueNames(ValueList); hk:=Registry.CurrentKey; aa:=255; for i:=1 to ValueList.Count do if ValueList.Strings[i-1]='NekoDWORDPolje' then begin RegEnumValue(hk,i-1,valueName,valueLength,nil,nil,@d,@aa); Move(d, Data, SizeOf(Data)); Application.MessageBox(PChar(IntToStr(Data)),'DWORD Value'); end; registry.CloseKey; end; [ Srki_82 @ 03.01.2005. 16:06 ] @
Ustvari... posto koristis TRegistry onda ti ni ne treba RegEnumValue, zar ne :)
Koristi TRegistry.ReadInteger, ReadString, ReadDateTime... ne treba da se patis kad se Borladn patio umesto tebe ;) [ borovac @ 03.01.2005. 19:30 ] @
To sam pokušao, ali nema Registry.ReadDWord
Da li da ga čitam kao float ili integer??? [ Srki_82 @ 03.01.2005. 20:22 ] @
Kao integer pa ga cast-uj u DWORD
[ borovac @ 04.01.2005. 18:53 ] @
Sada definitivno:
Bool pišem koristeći Registry.WriteBool, u registriju je tipa DWord Integer pišem koristeći Registry.WriteInteger, u registriju je tipa DWord Float pišem koristeći Registry.WriteFloat, u registriju je tipa Binary Šta se još u tipu Binary krije osim Float broja?? [ Srki_82 @ 04.01.2005. 19:43 ] @
Ovako... WriteInteger upisuje DWORD sto je ok. WriteBool upisuje vrednost 1 ili 0 kao DWORD, a ne kao Boolean pa se zbog toga u RegEdit vidi kao da je vrednost tima DWORD, ali kada svojim programom upisujes i citas vrednost onda dajes Bool i funkcija ti vraca Bool. Float tip ne postoji u reg. i zato jednostavno Delphi zapisuje sta se nalazi na memoriskoj lokaciji gde je tvoj float i to mora da upise kao binary. Kao binary mozes da upises bilo sta... samo vodi racuna da to sto upisujes ne bude preterano veliko (zadrzi se na maximum nekoliko desetina bajtova). Ako treba da zapises nesto vece snimi to u neki svoj cfg ili ini fajl.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|