Registryschlüssel löschen
-
hallo,
da ich etwas neues Registrieren muss, muss ich vorher ein bestimmten Schlüssel der Registry löschen. Dieser Schlüssel besitzt viele Unterschlüssel und diese viele Werte...
Habe DeleteKey der TRegistry benutzt, aber möglicherweise übersehe ich etwas in meinem Code:
void reg_loeschen() { TRegistry *pReg = new TRegistry; //dynamisch Speicherplatz festlegen AnsiString DelKey; DelKey = "\\Software\\L+P\\Reports"; //Schlüssel der gelöscht werden soll try { pReg->RootKey = HKEY_CURRENT_USER; //AnsiString ToDelKey = DelKey + "\\"; if (pReg->KeyExists(DelKey)) //auf Existenz überpüfen { pReg->OpenKey(DelKey,false); cout<<"Key wird gelöscht!"<<endl; bool erfolg = pReg->DeleteKey(DelKey); //Löschen des Schlüssels if (erfolg == true) { cout<<DelKey.c_str()<<" wurde geloescht"<<endl; } else cout<<DelKey.c_str()<<" konnte nicht geloescht werden"<<endl; } } catch(...) { ; } delete pReg; } int main() { reg_loeschen(); cout << "taste druecken"; getchar(); return 0; }
Laut Hilfe löscht DeleteKey auch alle Unterschlüssel und enthaltene Werte. Die Ausgabe ist immer, dass er den Key nicht löschen konnte.
schonmal danke
mfg
Steffen[ Dieser Beitrag wurde am 22.11.2002 um 09:38 Uhr von skho editiert. ]
[ Dieser Beitrag wurde am 25.11.2002 um 09:40 Uhr von skho editiert. ]
-
Du hast das OpenKey vergessen
Gruß Mikel
-
mmh hat auch noch nicht so recht funktioniert ... es werden immer nur Fragmente aus den Unterschlüsseln gelöscht, noch nichtmal das Schlüsselverzeichnis.
hab
pReg->OpenKey(DelKey,false);//schon oben im Code editiert
nach der Exists-abfrage geschrieben. Ich hoffe nicht, dass ich erst jeden Unterschlüssel abfragen und einzeln löschen muss ... denn ich habe festgestellt dass erst die Schlüssel gelöscht werden, die keine Unterschlüssel haben (und da auch nur die Werte und nicht das "Verzeichnis"). Bei einem erneuten Starten, werden die ersten Unterschlüssel der Unterschlüssel (*toller Ausdruck) gelöscht usw. Sehr komisch, wo doch die Hilfe schreibt... das alles gelöscht wird mit DeleteKey
[ Dieser Beitrag wurde am 22.11.2002 um 10:46 Uhr von skho editiert. ]
mmh ist sogar noch anders, er löscht manche Unterschlüssel vollständig (Daten und "Verzeichnis"), aber halt nicht alle...
[ Dieser Beitrag wurde am 22.11.2002 um 10:53 Uhr von skho editiert. ]
[ Dieser Beitrag wurde am 25.11.2002 um 09:41 Uhr von skho editiert. ]
-
hast du dir das Beispiel zu DeleteKey() in der BCB-Hilfe mal angeschaut?
Diese Zeile ist wichtig:
if (!Reg->OpenKey(Edit1->Text,false)) ShowMessage("Fehler beim Öffnen des Schlüssels");
Ansonsten würde ich mal Schritt für Schritt debuggen um zu überprüfen, ob auch die Einstellungen korrekt sind (Registry-Schlüssel vorhanden, korrekter Schlüssel angegeben)
-
Die Eigenschaft Acces von TRegistry auf KEY_ALL_ACCESS setzen ??
Ist nur eine Vermutung.
Ansonsten Iterativ.
Über GetKeyInfo() die Anzahl Unterschlüssel besorgen un dann in der Schleife alles löschen.Gruß Mikel
-
mmh habe den Borland Builer 3.0 und hier habe ich weder eine Eigenschaft "Access" noch find ich ein Bsp. zu DeleteKey für TRegistry.
Wenn ich pReg->GetKeyInfo(TRegKeyInfo &Value) nehme, muss Value vom Typ TRegKeyInfo sein, wenn ich allerdings schreibe
TRegKeyInfo Value;
dann findet er die typendefinition dazu nicht, geht das anders? muss ich da noch was angeben, damit mir der Typ TRegKeyInfo zur Verfügung steht...
ich glaub ich mach erstmal mittag... kann nix mehr denken ... klingt zumindest alles logisch... aber klappt irgendwie nix
wem fällt noch was ein?
[ Dieser Beitrag wurde am 22.11.2002 um 11:49 Uhr von skho editiert. ]
-
Welche Windowsversion benutzt du? Es ist nur in den Windowsversionen 95 bis ME erlaubt, komplette Schlüssel samt Unterschlüssel zu löschen. Alle NT basierten Versionen erlauben dies nicht! Wenn du mehr zur Registry wissen willst, schaue in das Tut in meiner Signatur.
-
hallo maloo,
wie kommst du denn darauf ? also wir haben eine software geschrieben bzw. eine installationsversion incl. deinstallation die unter allen windows versionen registryschlüssel samt unterschlüssel löscht ! würde das net gehen würde man bei der installation ziehmliche probleme bekommen !
ciao
-
@ konvenienz: Bist du dir sicher, dass ihr es auf einem WindowsNT-System geschafft habt einen Registryschlüssel zu löschen, der Unterschlüssel (nicht Werte!!!) enthielt? Laut Microsoft und meinen eigenen Erfahrungen ist dies unmöglich. Schaue dir in der WindowsSDK-Hilfe mal den Begriff RegDeleteKey an. Dort steht es eigentlich schwarz auf weiss.
Nichts für ungut und noch ein schönes Wochenende wünscht
-
@maloo - ja deine Tut hab ich mir vorher schonmal angeschaut aber leider nix zum löschen gefunden... ich habe hier Win2k... dass proggie soll dann aber auf allen Systemen (ab Win95 bis XP) laufen...ich hatte auch schon die Idee von Mikel, eine Schleife zu bauen um die registryeinträge zu löschen... aber irgendwie hab ich Probs (oder keine Ahnung *smile*) mit dem Datentyp bei GetKeyInfo... Was schlägst du vor, wenn du sagst, dass es nicht geht mit dem löschen...Wie gesagt der o.g. Code bewirkt das löschen von Schlüsseln, es sind aber jedesmal andere und er löscht auch nicht alles.
@konvenienz - wenn du so ein Proggie mal geschrieben hast, wie seid ihr rangegangen??
Schaut euch doch einfach nochmal den o.g. Code an (OpenKey ist ja mittlerweile eingefügt)
Thx nochmal
[ Dieser Beitrag wurde am 25.11.2002 um 09:37 Uhr von skho editiert. ]
-
*hochschieb* *smile*
-
@JeGr - das Debuggen hat nicht viel gebracht... er setzt "erfolg" nicht auf true (weil es ja auch kein Erfolg war das Löschen) ... ansonsten konnte ich aus dem debuggen nichts erkennen was mich weiterbrächte!!
Hat nicht noch jemand eine Idee... wäre wirklich sehr dankbar... hat das denn noch niemand gemacht.
Hoffe sehr auf Hilfe.
mfg
-
Hi,
@maloo - ja deine Tut hab ich mir vorher schonmal angeschaut aber leider nix zum löschen gefunden... ich habe hier Win2k... dass proggie soll dann aber auf allen Systemen (ab Win95 bis XP) laufen..
Wni2k basiert auf NT. Deshalb wirst du wohl nicht löschen können, wenn sich Unterverzeichnisse im Verzeichnis befinden.
Gehe die Eintrge in einer Schleife durch um die Unterverzeichnisse zu löschen, wie es die anderen bereits erwähnt haben.
-
nunja ... wollt ich ja auch nun machen, dass problem ist aber, dass ich mit dem Typ TRegKeyInfo Sorgen habe.
wenn ich diesen Code erstmal nehme
TRegistry *pReg = new TRegistry; AnsiString DelKey; DelKey = "\\Software\\L+P\\Reports\\"; TRegKeyInfo *wert = new TRegKeyInfo; try { pReg->RootKey = HKEY_CURRENT_USER; if (pReg->KeyExists(DelKey)) { if (pReg->OpenKey(DelKey,false)) { pReg->GetKeyInfo(&wert); //Hier Fehlermeldung cout << wert //Ausgabe? } else cout<<"Key konnte nicht geöffnet werden"<<endl; } else cout<<"Key existiert nicht"<<endl; } catch(...) { ; } delete wert; delete pReg; }
dann habe ich (an der kommentierten stelle) Fehlermeldungen:
*[C++Fehler] reg2.cpp(73): Cannot convert 'Registry::TRegKeyInfo * *' to 'Registry::TRegKeyInfo'.
[C++Fehler] reg2.cpp(73): Type mismatch in parameter 'Value' in call to '_fastcall Registry::TRegistry::GetKeyInfo(Registry::TRegKeyInfo &)'.
*Wie muss ich den Typ deklarieren und vor allem wie kann ich "wert" dann auch ausgeben bzw. auswerten? Denn es gibt ja mehrere Sachen zurück. die Hilfe gibt nicht wirklich viel dazu her.
mfg
-
schau dir nochmals genau den Aufruf von GetKeyValue() an.
Vielleicht könnte dies noch eine Möglichkeit sein, die Unterschlüssel zu löschen: (hab ich in der BCB-Hilfe gesehen)
Da gibt es eine Eigenschaft namens Access. Setz diese Eigenschaft mal vor dem OpenKey auf KEY_ALL_ACCESS
-
entweder bin ich blind oder ihr habt ne andere Hilfe als ich...
ich habe BCB 3.0 und habe hier für TRegistry die Methoden GetKeyInfo() und GetKeyNames(). Mit GetKeyInfo würde das gehen, das ist korrekt, aber der Prototyp lautet:
bool __fastcall GetKeyInfo(TRegKeyInfo &Value);
und ich egal wie ich "Value" deklarieren oder definieren möcht, immer kommen o.g. Fehlermeldungen.
Und ich hab in meiner Hilfe nur den "Artikel" zu den oben genannten Methoden der TRegistry und da ist weder ein Hinweis auf eine Methode Access noch ein Beispiel. Welchen Builder benutzt ihr denn?
*komischguck*mfg
[ Dieser Beitrag wurde am 25.11.2002 um 13:51 Uhr von skho editiert. ]
Nachtrag: Habe erstmal rausgefunden wie ich TRegKeyInfo deklariere (einfach vor die Funktion folgendes geschrieben):
Registry::TRegKeyInfo wert;
nun stellt sich die Frage, wie kann ich auf die Unterschiedlichen Werte in "wert" nun zugreifen, dazu steht nun wirklich überhaupt nichts in der Hilfe (zu mindest in meiner) Anregungen wären gut... dann dürfte die Schleife auch keine Problem mehr darstellen.
[ Dieser Beitrag wurde am 25.11.2002 um 13:58 Uhr von skho editiert. ]
-
also ich hab hier den BCB 5 Enterprise Edition.
Die Eigenschaft Access legt die Zugriffsebene beim Öffnen von Schlüsseln fest.
__property long Access = {read=FAccess, write=FAccess};
Die Methode gibt Informationen über den aktuellen Schlüssel zurück.
struct TRegKeyInfo
{
int NumSubKeys;
int MaxSubKeyLen;
int NumValues;
int MaxValueLen;
int MaxDataLen;
_FILETIME FileTime;} ;
bool __fastcall GetKeyInfo(TRegKeyInfo &Value);
-
Hallo
Wenn du es über die WinAPI lösen bist, bist du hier eigentlich im falschen Teil des Forums. Vieleicht können sie dir im WinAPI-Forum besser weiter helfen.
Wenn du TRegistry - also die BCB-Klasse benutzt, kannst du zum Auslesen GetKeyNames benutzen. GetKeyNames speichert alle Unterschlüssel in eine Stringliste, deren Strings du dann einzeln abarbeiten müstest. Diese mußt du natürlich auch wieder auf Unterschlüssel prüfen.
Diese Vorgehensweise sollte eigentlich übersichtlicher sein, wenn auch langsamer, da sich TRegistry der WinAPI-Funktionen bedient
-
hi,
sorry @maloo aber ich muss dich eines besseren belehren ! unter 95/98/ment/2000/xp löschen wir vor der installation alle vorhanden verzeichnisse und regeinträge !
ich habe es auch schwarz auf weiss !
nichts für ungut !
ciao
-
habe jetzt gerade noch mal in die sdk gesehen und da steht explizit, das man das machen kann, nur müssen vorher alle untereinträge gelöscht sein. das kann doch nicht so schwierig sein!
Windows NT/2000/XP: The subkey to be deleted must not have subkeys. To delete a key and all its subkeys, you need to recursively enumerate the subkeys and delete them individually. To recursively delete keys, use the SHDeleteKey function.
___SHDeleteKey___
und wenn du das mit tregistry machen willst, solltest du den key vorher wieder schliessen (closekey). schonmal erlebt, das man unter windows was geöffnetes löschen kann?