funkcja GetValueNames - problem

0

Witam, mam taką funkcję która pobiera mi wszystkie wartości z podanego klucza, wszystko jest ok z pobieraniem z kluczy które nie posiadają dużą ilość wartości, pojawia się problem gdy chce pobrać wszystkie wartości z tego klucza :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders

klucz ten zawiera u mnie prawie 5 tyś różnych wartości, gdy proboje pobrac je za pomocą tej funkcji zwraca pusty wynik.. uruchamiam program jako administrator.

function get_value_names(rootkey: HKEY; key: string): TStrings;
var
  reg: TRegistry;
begin
  result := TStringList.Create;
  reg := TRegistry.Create;
  try
  reg.RootKey := rootkey;
  reg.OpenKey(key, false);
  reg.GetValueNames(result);
  finally
  reg.Free;
  end;
end;
1

Ojejku, mam nadzieję że uda rozwiązać ci sie ten problem!

0

raczej mi się nie uda

1
ajax888 napisał(a):

raczej mi się nie uda

Wydaje mi się kolego że nie zrozumiałeś że chodzi mi o to, że nie zadałeś pytania. Niemniej, ja w ciebie wierzę, ufam że nauczysz się zadawać pytania.

0

chyba ty nie zrozumiałeś mojego przekazu, pisze wyraźnie że klucz zawiera 5 tyś wartości jednak funkcja GetValueNames nie zwraca nic..

0

sorki GetValueNames to procedura :]

1

chyba ty nie zrozumiałeś mojego przekazu, pisze wyraźnie że klucz zawiera 5 tyś wartości jednak funkcja GetValueNames nie zwraca nic..

Ty chyba kolego nie wiesz co to jest pytanie :) . Poćwicz trochę, ja wierzę że ci się uda.

0

nie śmieć mi tematu żałosny człowieku, odejdź.

1
ajax000 napisał(a):

nie śmieć mi tematu żałosny człowieku, odejdź.

Czemu mam nie śmiecić tematu który nie ma sensu? Nie zadałeś pytania, więc chyba nie oczekujesz odpowiedzi? Mógłbyś powiedzieć czego chcesz tak jak już wcześniej mówiłem, ale ty zamiast po prostu posłuchać mojej dobrej rady, brniesz dalej w swoje głupoty. Nie ma pytania = nie ma odpowiedzi. Nie wiem czego oczekujesz.

Btw. Widzę że na forum ktoś się podszywa pode mnie i śmieci po wątkach. Cóż, mam nadzieję że osoby tutaj są na tyle mądre że są to w stanie ogarnąć.

Btw.#2. Od teraz mam nazwę Oho, będę ją zmieniać jeżeli ktoś znowu sobie zrobi konto o mojej nazwie (pozdrawiam moich fanów).

0
  1. Zamiast TStrings zastosuj TStringList
  2. Sprawdź co zwraca Ci funkcja Reg.OpenKey
  3. Spróbuj odwołać się do innego klucza, który zawiera kilka wartości
  4. Sprawdź, czy przekazujesz poprawnie ścieżkę (patrz pkt 2).

Pokaż jak wywołujesz funkcję get_value_names(rootkey: HKEY; key: string): TStrings;

0
Opi napisał(a):
  1. Zamiast TStrings zastosuj TStringList
  2. Sprawdź co zwraca Ci funkcja Reg.OpenKey
  3. Spróbuj odwołać się do innego klucza, który zawiera kilka wartości
  4. Sprawdź, czy przekazujesz poprawnie ścieżkę (patrz pkt 2).

Pokaż jak wywołujesz funkcję get_value_names(rootkey: HKEY; key: string): TStrings;

wywołuje w taki sposób : memo1.Lines.Text := get_value_names(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders').Text;

zmieniłem na TStringList, ale dalej nie zwraca nic.

0

Tak powinno działać:

const
  KEY = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders';
var
  reg: TRegistry;
  sl: TStringList;
begin
  reg:= TRegistry.Create;
  try
  reg.RootKey:=HKEY_LOCAL_MACHINE;
  if reg.OpenKeyReadOnly(KEY) then //do odczytu (do zapisu na Vista i nowszych potrzebne  są prawa admina )
  begin
    sl:= TStringList.Create;
    try
    reg.GetValueNames(sl);
    ListBox1.Items.Assign(sl);
    finally
    sl.Free;
    end;
  end
  else
    Application.MessageBox('Błąd otwarcia klucza rejestru',
      PAnsiChar(Application.Title), MB_ICONERROR);
  finally
  reg.Free;
  end;
end;
0

uruchamiam jako administrator w windows 7, i mam błąd otwarcia klucza...nie wiem dlaczego.

0

A na pewno w 7 istnieje taki klucz (nie mam 7 i nie mogę sprawdzić)?

0

tak istnieje, sprawdzam za pomocą regedituser image

0

Kod, który podał @kAzek działa prawidłowo. Przynajmniej u mnie pod Windows 7 Ultimate 64 bit z wyłączonym UAC. Musiałem sobie taki klucz dla testów stworzyć i dodać jakieś wartości, bo u mnie klucza Folders nie było, ale pomijając to, faktem jest że kod działa ok i dla każdego istniejącego klucza, który zawiera jakie kolwiek wartości powinien je zwrócić w ListBox1.Items.

0

Na 99% będzie to zła ścieżka lub brak uprawnień.

Możesz spróbować sprawdzić jaki błąd zgłasza Windows o ile OpenKeyReadOnly nie wykonuje żadnych funkcji systemowych po próbie otwarcia klucza:

  if reg.OpenKeyReadOnly(KEY) then //do odczytu (do zapisu na Vista i nowszych potrzebne  są prawa admina )
  begin
    { ... }
  end
  else
    Application.MessageBox(PAnsiChar('Błąd otwarcia klucza "' + KEY + '"#13#10' + SysErrorMessage(GetLastError)), PAnsiChar(Application.Title), MB_ICONERROR);
0

sprobuj z konstruktorami:

Reg:= TRegistry.Create(KEY_ENUMERATE_SUB_KEYS);
lub
  Reg:= TRegistry.Create(KEY_READ);
0

z konstruktorami probowalem, dalej błąd..


Blad otwarcia klucza "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"\r\nThe operation completed successfully

0

"Widzę że na forum ktoś się podszywa pode mnie i śmieci po wątkach" - to zarejestruj się w końcu - nie będziesz miał tego problemu; Swoją drogą "oho" też już się podpisywałeś, tylko odpowiedzi były grzeczniejsze; Poza tym nie ma konta o nazwie "oho" - przecież piszesz jako gość; Każdy sobie może ustawić taką nazwę i robić Ci koło d**y; Zarejestruj się, nie będziesz miał kłopotów z tego tytułu;

Oho też się podpisywałem, i przepraszam że grzeczniej. Nie wiedziałem że ktoś jeszcze pamięta :)
Gościem jestem nie bez powodu. Konto mam (Payl), niestety ktoś mi je wyłączył - teraz już rozumiesz czemu piszę jako gość? Mam nadzieję. Nie opłaca mi się zakładać nowego konta, bo też mi wyłączą.
A co do braku konta 'oho' - jest konto '-123' i o to mi chodziło. Dlatego też zmiana nicku.
I nie, nie przeszkadza mi to że ktoś mi usiłuje przeszkadzać - informuję żebyście wy również wiedzieli. Ja w każdym razie nie mam zamiaru dać sobie jakiemuś 'wannabe -123' przepędzić.

Żeby nie było offtopicu:
Skoro masz błąd:

Blad otwarcia klucza "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"\r\nThe operation completed successfully

To pewnie gdzieś jest za mały bufor albo innego rodzaju błędy występują w VCL/LCL. Jeżeli umiesz, to sprawdź jakimś assemblerowym debuggerem, może to powie coś więcej. Do tego ProcMon może ci pomóc, on monitoruje winapi calle do rejestru.

Generalnie ten błąd może być nieomijany, moim zdaniem wynika on z ograniczeń LCL/VCL. Możesz chcieć spróbować z innym kompilatorem, np. inną wersją delphi albo z Lazarusem (którego swoją drogą polecam).

0

Spróbuj też z innym kluczem gdzie jest mniej wpisów. Być może TRegistry ma jakiś limit.

0

Wcześniej bym jednak spróbował użyć WinAPI:

const
  KEY = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders';
var
  reg: TRegistry;
  sl: TStringList;
  key_handle: HKEY;
begin
  if RegOpenKeyExA(HKEY_LOCAL_MACHINE, PAnsiChar(KEY), 0, KEY_READ, key_handle) <> 0 then
    ShowMessage(SysErrorMessage(GetLastError));
  else
    RegCloseKey(key_handle);

  // ...

Jeśli to nie rozjaśni sprawy to użyj debuggera. Aby móc poruszać się po bibliotekach Delphi (tutaj po TRegistry) zdaję się trzeba coś ustawić w opcjach debugger'a, coś a'la "debug vcl". Również wspominany ProcMon może się przydać.

0

zwraca ten sam błąd :


The operation completed successfully

OK

0

Odpal to:

const
  KEY = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders';
var
  key_handle: HKEY;
  ret: LongInt;
begin
  ret := RegOpenKeyExA(HKEY_LOCAL_MACHINE, PAnsiChar(KEY), 0, KEY_READ, key_handle);
  if ret <> 0 then
    ShowMessage(SysErrorMessage(ret));
  else
    ShowMessage('Klucz otwarty!');
end;
0

The system cannot find the file specified

OK

0

A inne klucze? Np. spróbuj "SOFTWARE". Jeśli nie ma z nimi problemu to znaczy, że ten "Folders" nie istnieje.

0

z innymi kluczami jak dotąd nie miałem problemu tylko z tym, klucz ten na pewno istnieje gdyż sprawdzam za pomocą regedita, a także mam taki program CCleaner który operuje na rejestrze i potrafi wyciągać nazwy wartości z tego klucza.

0

A coś robisz wcześniej? Odpalasz ten kod sam, czy z czymś innym? Jeśli tak to spróbuj go odpalić samotnie i zobacz co będzie.
Aby mieć 100% pewności, że ścieżka jest ok to z RegEdit'a wyeksportuj sobie tą gałąź do pliku ".reg", otwórz go w notatniku lub Delphi i przekopiuj ścieżkę.

0

wywołuje w taki sposób : memo1.Lines.Text := get_value_names

Autor coś ściemnia. Jak chcesz przyrównać TStrings do stringa? Przecież to nawet kompilacji nie przejdzie.
Poza tym lepiej będzie jak to będzie funkcja zwracająca boolean.

tzn:

function get_value_names(var Dest: TStrings): boolean;

Oczywiście musisz przekazywać wtedy już utworzone TStringList tudzież inny obiekt dziedziczący po TStrings.

1 użytkowników online, w tym zalogowanych: 0, gości: 1