funkcja GetValueNames - problem

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.

Kopiuj
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).

flowCRANE
"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;
Opi
  • Rejestracja:ponad 20 lat
  • Ostatnio:około 16 godzin
  • Postów:1029
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.

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

Tak powinno działać:

Kopiuj
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;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
0

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

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
0

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


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
0

tak istnieje, sprawdzam za pomocą regedituser image

olesio
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
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.


Pozdrawiam.
edytowany 1x, ostatnio: olesio
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
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:

Kopiuj
  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);
edytowany 5x, ostatnio: adf88
0

sprobuj z konstruktorami:

Kopiuj
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).

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

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

edytowany 1x, ostatnio: adf88
KA
Wątpię jeżeli już to byłby problem z GetValueNames a nie z samym otwarciem klucza.
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

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

Kopiuj
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ć.

edytowany 8x, ostatnio: adf88
KA
No tak zajebiście nie udało się otworzyć klucza a ty zamykasz...
0

zwraca ten sam błąd :


The operation completed successfully

OK

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

Odpal to:

Kopiuj
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

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
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.

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
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ę.

JU
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 miesiące
  • Postów:5042
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:

Kopiuj
function get_value_names(var Dest: TStrings): boolean;

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)