registry mehrmals auslesen
-
"Nicht abgefangene Ausnahme in bla.exe (NTDLL.DLL): 0xC0000008: Invalid Handle.
und im debugger ist die zeile:
7789FFE4 mov eax,dword ptr [esp]
vllt hilft das ja auch -.-
achja: ich benutze die membervariable h_hKey für mein RegOpenKeyEx(h_hKey ...)
wenn ich stattdessen einfach HKEY_LOCAL_MACHINE nehme, stört den debugger das überhaupt nicht mehr. das verwirrt mich daran am meisten
-
also zuallererst mal ist der string für temp_key nur ein Byte groß und das ist der Stringterminator..
Wundert mich, dass es überhaupt funktioniert hat.
Wenn du da was rein schreibst überschreibst du die Daten, die direkt dahinter stehen.
-
also temp_key liefert mir den gesamten string, der in der registry steht, ist wohl also nicht nur ein byte groß. ist aber vom typ byte.
und welche daten meinst du überschreibe ich? ich gebe in meine funtkion eine variable rein meinetwegen abc mit dem inhalt "schluessel1" und nach der funktion hat abc dann den inhalt dieses schluessels. also bsp. ich habe REG_SZ schluessel1 mit inhalt "einTest", dann gibt mir
char abc[20] = "schluessel1"; bool t_bool = db_out(abc);
mit cout << abc aus "einTest"
aber das ist ja gar nicht das problem. das problem ist, dass ich die funktion nicht zweimal aufrufen kann. beim zweiten mal kommt halt immer besagter fehler. den kann ich verhindern, wenn ich statt h_hKey einfach HKEY_LOCAL_MACHINE nehme, wobei das jedoch genau auch der inhalt von h_hKey ist, im konstruktor lege ich das nämlich so fest. das verwundert mich halt
und noch ein fall: existiert der schlüssel gar nicht, kann ich die funktion beliebig oft aufrufen ohne fehler. das verwirrt, oder? ^^naja vllt hast du ja ne idee
-
unbeholfen_ schrieb:
also temp_key liefert mir den gesamten string, der in der registry steht, ist wohl also nicht nur ein byte groß.
Das ist so, als ob man aus der Tatsache, dass man eine Kreuzung ohne Unfall überquert hat, folgern, dass die Ampel grün war. Glaub uns, temp_key ist nur ein Byte groß, du überschreibst deinen Stack. Da kann alles passieren.
den kann ich verhindern, wenn ich statt h_hKey einfach HKEY_LOCAL_MACHINE nehme, wobei das jedoch genau auch der inhalt von h_hKey ist, im konstruktor lege ich das nämlich so fest. das verwundert mich halt
HKEY_LOCAL_MACHINE ist eine Konstante (genauer ein Literal), h_hKey nicht.
und noch ein fall: existiert der schlüssel gar nicht, kann ich die funktion beliebig oft aufrufen ohne fehler. das verwirrt, oder? ^^
Vielleicht solltest du den Rückgabewert von RegOpenKeyEx auswerten.
-
Ja, es mag sein, dass der gesamte String ausgegeben wird, aber prinzipiell allokiert dein OS den Speicher nacheinander.
nen char foo[] = "" allokiert nur das Byte für den Terminator.
Jetzt stell dir vor, du hast darunter dein Programm im RAM.
Solange du weniger als 4 Byte eingelesen hast, hast du auch kein Problem, da chars normalerweise an 4er-Grenzen ausgerichtet werden um den Zugriff zu optimieren. Liest du nun aber 16 Byte aus, ist das für dein OS unter Umständen noch okay. Der Speicher wird von deinem Programm allokiert und gennutzt.
Nur dummerweise überschreibst du ein paar Byte deines Programms.Beim nächsten Mal springt dein Programm genau in diesen eingelesenen Text und bekommt Anweisungen, die es nicht verarbeiten kann (weil für den Rechner ist string = int = float = hex = absturz...)
-
und was kann ich dann nun machen? ich war schon überglücklich, dass es überhaupt einmal geklappt hat. nun bin ich nur vollständig verwirrt
wie kann ich denn dafür sorgen, dass nix überschrieben wird?
achja regopenkeyex liefert mir nur 0 d.h. der schlüssel existiert und das handle wird geöffnet oder so...
aber was mach ich denn nu?
-
einfach
char temp_key[256];
dann
strcpy (temp_key, "");
oder memset (temp_key, '\0', sizeof(temp_key));
-
so das klingt schonmal gut..
aber das problem löst es auch nicht. ich hab weiterhin die fehlermeldung wenn ich die funktion mehrmals benutzen möchte.
-
Warum schließt du h_hKey überhaupt? Hast du es mit RegOpenKey(Ex) geöffnet?
-
ja öh das hab ich direkt wieder rausgenommen, das bewirkt eigentlich gar nix ^^
hilft aber auch nicht bei dem problem *g*
hatte es vorher mal drin um zu testen ob's dann evtl geht aber naja hab's jetzt wieder draußen wie gesagt -.-
-
wie groß ist denn der Inhalt des strings?
-
welcher genau? der, den ich auch der registry auslese? ich teste es momentan mit einem 5 zeichen langen REG_SZ...
-
hi nochmal bitte antwortet bin ja schon im forum auf seite 2 gerutscht... hoffe dass das überhaupt jetzt noch einer liest. es ist wichtig ^^